剑指 Offer 07. 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例 1:
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
示例 2:
Input: preorder = [-1], inorder = [-1]
Output: [-1]
限制:
0 <= 节点个数 <= 5000
先说下吧,这道题,,背过吧,实际开发没什么意义。工作就慢慢就理解了。
首先说下原理,先序遍历的第一个节点是根节点,这道题说不存在重复的元素,从而中序遍历的这个节点就可以将中序遍历结果分成两个子树,先序遍历的结果中去掉子节点,然后可以根据中序遍历拆成的两个子树的节点,分别再次确定下两个子树的根节点,像这种一步一步递归下去就可以确定每个节点的位置。从这种递归和区间分治的思想就可以看出,这道题的解法就这样,但是节点数量是大于1000的,所以递归最好不要用。改成迭代就好。
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution(object): def buildTree(self, preorder, inorder): """ :type preorder: List[int] :type inorder: List[int] :rtype: TreeNode """ def buildTree_recur(preorder_left,preorder_right,inorder_left,inorder_right): if preorder_left>preorder_right: return None preorder_root_index = preorder_left inorder_root_index = index[preorder[preorder_root_index]] root = TreeNode(preorder[preorder_root_index]) size_left = inorder_root_index - inorder_left root.left = buildTree_recur(preorder_left+1,preorder_left+size_left,inorder_left,inorder_root_index-1) root.right = buildTree_recur(preorder_left+1+size_left,preorder_right,inorder_root_index+1,inorder_right) return root n = len(preorder) index = {element:i for i,element in enumerate(inorder)} return buildTree_recur(0,n-1,0,n-1)
这里刚好可以复习下简单哈希表的创建
有空补下迭代的解法: