def build1(inorder, postorder): if not inorder: return None elif len(inorder) == 1: return TreeNode(inorder[0]) else: postorder_root_val = postorder[-1] root = TreeNode(postorder_root_val) for i in range(len(inorder)): if postorder_root_val == inorder[i]: inorder_root_index = i break if inorder_root_index == 0: root.left = None root.right = build1(inorder[1:], postorder[:-1]) elif inorder_root_index == len(inorder) - 1: root.left = build1(inorder[:-1], postorder[:-1]) root.right = None else: root.left = build1(inorder[:inorder_root_index], postorder[:inorder_root_index]) root.right = build1(inorder[inorder_root_index + 1:], postorder[inorder_root_index:-1]) return root
def deserialize_tree(s): if not s: return val = s.pop(0) root = None if val != 'null': root = TreeNode(val) root.left = deserialize_tree(s) root.right = deserialize_tree(s) return root
def build1(preorder, inorder): if not preorder: return None if len(preorder) <= 1: return TreeNode(preorder[0]) root_node = preorder[0] root = TreeNode(root_node) for i in range(len(inorder)): if root_node == inorder[i]: inorder_root_node_index = i break root.left = build1(preorder[1:inorder_root_node_index + 1], inorder[:inorder_root_node_index]) root.right = build1(preorder[inorder_root_node_index + 1:], inorder[inorder_root_node_index + 1:]) return root
def before_middle_construct_tree(before_seq, middle_seq): """ 根据二叉树的前序遍历和中序遍历重建二叉树 :param before_seq: List[int] :param middle_seq: List[int] :return: TreeNode """ if len(before_seq) == 0 or len(middle_seq) == 0: return root_node = TreeNode(before_seq[0]) root_index = middle_seq.index(root_node.val) left_node = before_middle_construct_tree(before_seq[1:root_index + 1], middle_seq[:root_index]) right_node = before_middle_construct_tree(before_seq[root_index + 1:], middle_seq[root_index + 1:]) root_node.left = left_node root_node.right = right_node return root_node