由先序、中序、后序遍历重建二叉树

先序、中序重建

给定先序遍历和中序遍历数组,依次重建出整个二叉树

由先序遍历可知,先序遍历的第一个值就是整个树的根节点,在中序遍历数组中找到该值对应的位置,则该位置左边部分就是整个树的左子树,右边就是整个树的右子树。
得到了左子树和右子树长度后,可以根据该长度确定,在先序遍历中下一个右子树的根节点位置,而左子树的位置,因为是先序遍历,所以当前根节点的下一位就是它的左子树。
左子树、右子树的节点位置确定后,递归建立剩余的左子树和右子树,当左子树和右子树的位置相等时,结束递归。

代码如下:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if len(preorder) == 0 or len(inorder) == 0: return 
        # p_i: 根节点 
        # in_i:左/右子树节点的范围起点 
        # in_j:左/右子树节点范围的结束
        def process(preorder, inorder, p_i, in_i, in_j):
            if in_i > in_j: return 
            
            head = TreeNode(preorder[p_i])
            index = inorder.index(preorder[p_i])

            head.left = process(preorder, inorder, p_i + 1, in_i, index - 1)
            head.right = process(preorder, inorder, p_i + index - in_i + 1, index + 1, in_j)

            return head
        
        return process(preorder, inorder, 0, 0, len(inorder) - 1)

猜你喜欢

转载自blog.csdn.net/yaogepila/article/details/107001218