1.题目描述
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
2.思路
- 二叉树的前序遍历:规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树
遍历的顺序为:ABDGH-CEIF - 二叉树的中序遍历:规则是若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树
遍历的顺序为:GDHBAE-ICF - 所以前序的第一个节点必定是根节点,在中序遍历中找到根节点所在的索引x,观察研究可以发现,在中序遍历中根节点索引之前的即为其左孩子,即左孩子们 = root[:x];那么在前序遍历中的左孩子个数和中序遍历是一样的,即为从前序遍历中索引为1(索引0为根节点)到x+1的节点;其余的则为右孩子们。
最后递归调用自己,得到二叉树
3.代码
# 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
"""
if inorder==[]:
return None
root = TreeNode(preorder[0])
# 找到根节点在中序遍历中的位置(索引)
index = inorder.index(root.val)
# 递归调用
root.left=self.buildTree(preorder[1:index+1],inorder[0:index])
root.right=self.buildTree(preorder[index+1:],inorder[index+1:])
return root