题目描述
输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。
注意:
- 二叉树中每个节点的值都互不相同;
- 输入的前序遍历和中序遍历一定合法;
样例
给定:
前序遍历是:[3, 9, 20, 15, 7]
中序遍历是:[9, 3, 15, 20, 7]
返回:[3, 9, 20, null, null, 15, 7, null, null, null, null]
返回的二叉树如下所示:
3
/ \
9 20
/ \
15 7
算法
(递归) O(n)
首先应该注意,先序遍历的第一个数就是根节点的值;
然后在中序遍历中找到根节点值对应的位置 pos,则 pos 左边是左子树的中序遍历,右边是右子树的中序遍历;
根据先序遍历和中序遍历的特性,可知:
当前根节点在中序遍历中的位置是pos,如图得,先序遍历中左子树为[1,pos+1),右子树为[pos+1,最后],中序遍历中左子树为[0,pos),右子树为[pos+1,最后];
有了左右子树的前序遍历和中序遍历,我们的思路就是先递归创建出左右子树,然后再创建根节点。
Python3 代码
### Python3 代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
# 若先序遍历为空,即二叉树为空,则返回None
if len(preorder) == 0:
return None
# 若二叉树只有一个根节点,直接返回这个根节点
if len(preorder) == 1:
return TreeNode(preorder[0])
root = TreeNode(preorder[0])
# list.index(value) 从列表list中找出某个值value第一个匹配项的索引位置,如果没有找到对象则抛出异常。
pos = inorder.index(preorder[0])
root.left = self.buildTree(preorder[1:pos+1], inorder[:pos])
root.right = self.buildTree(preorder[pos+1:], inorder[pos+1:])
return root