给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
递归的思路
但是这里面的细节需要一些优化才能通过OJ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
class Solution: def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode: if not preorder or not inorder: return None if len(preorder) <=1 or len(inorder) <= 1: return TreeNode(preorder[0]) root_val = preorder[0] root = TreeNode(root_val) inorder_dict = {v:k for k, v in enumerate(inorder)}
i = 0 inorder_index = inorder_dict[root_val] left_tree_num = inorder_index right_tree_num = len(inorder) - inorder_index - 1 root.left = self.buildTree(list(preorder[1:left_tree_num+1]), list(inorder[:inorder_index])) root.right = self.buildTree(list(preorder[1+left_tree_num:]), list(inorder[inorder_index+1:])) return root
|
迭代法
TODO