题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
解题思路1:
已知二叉树的前序与中序,由于前序遍历的顺序是:打印 - 左 - 右,中序遍历的顺序是:左 - 打印 - 右。
- 首先根据前序遍历已知根节点的位置,然后查找根节点在中序遍历中的位置。
- 在中序遍历根节点的左边,为左子树;中序遍历根节点的右边,为右子树;
- 返回前序遍历中,左右子树在根节点首次出现的位置,为下一层子树的根节点,依次循环遍历即可;
代码:
# 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):
if not preorder:
return None
#创建当前节点
node = TreeNode(preorder[0])
#查找当前的根节点在中序遍历中的位置
index = inorder.index(preorder[0])
# 划分左右子树
left_pre = preorder[1:index+1]
left_in = inorder[:index]
right_pre = preorder[index+1:]
right_in = inorder[index+1:]
# 遍历创建子树
node.left = self.buildTree(left_pre, left_in)
node.right = self.buildTree(right_pre, right_in)
# 返回当前节点
return node
题目来源: