面试题7:重建二叉树

剑指 Offer 07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例 1:

面试题7:重建二叉树


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)

这里刚好可以复习下简单哈希表的创建

有空补下迭代的解法:

上一篇:


下一篇:【LeetCode 二叉树专项】删除二叉搜索树中的节点(450)