重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路
二叉树根据根节点、左子树和右子树遍历顺序不同分为先序遍历、中序遍历和后续遍历。
可参考关于二叉树的前序、中序、后序三种遍历
通过中序遍历+先序/后序遍历就可以确定唯一二叉树,先序和后续遍历无法确定唯一二叉树,因为根节点在两侧,无法区分左右子树。
该题通过在先序遍历中找到的根节点将中序遍历中的左右子树分开来进行树的重建,并采用递归的方法对其子树重建。
很多树相关的题目都用到了递归方法,在遇到相关题目时应该优先考虑。
python代码
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
#该函数重建树并返回树的根节点
if not pre or not tin:
#边界条件
return None
root = TreeNode(pre.pop(0)) #pre的第一位为根节点
index = tin.index(root.val) #在tin中查找根节点位置
root.left = self.reConstructBinaryTree(pre, tin[:index]) #重建左子树并返回左子树根节点
root.right = self.reConstructBinaryTree(pre, tin[index+1:]) #重建右子树并返回左子树根节点
return root