先序、中序重建
给定先序遍历和中序遍历数组,依次重建出整个二叉树
由先序遍历可知,先序遍历的第一个值就是整个树的根节点,在中序遍历数组中找到该值对应的位置,则该位置左边部分就是整个树的左子树,右边就是整个树的右子树。
得到了左子树和右子树长度后,可以根据该长度确定,在先序遍历中下一个右子树的根节点位置,而左子树的位置,因为是先序遍历,所以当前根节点的下一位就是它的左子树。
左子树、右子树的节点位置确定后,递归建立剩余的左子树和右子树,当左子树和右子树的位置相等时,结束递归。
代码如下:
# 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)