问题描述
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例子:
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
题解
每次访问前序遍历中的第一个数,然后找到这个值在中序遍历的位置,再分左子树和右子树,递归。
代码
class Solution(object):
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
def bt(node, preo, ino, left=1, right=1):
if left==1 and right==0:
node.left = TreeNode(preo[0])
node = node.left
elif left==0 and right==1:
node.right = TreeNode(preo[0])
node = node.right
index = ino.index(preo[0])
if index < len(preo)-1:
right_in = ino[index + 1:]
right_pre = preo[index + 1:]
bt(node, right_pre, right_in, left=0, right=1)
if index > 0:
left_in = ino[:index]
left_pre = preo[1:index + 1]
bt(node, left_pre, left_in, left=1, right=0)
root = TreeNode(None)
bt(root, preorder, inorder, left=1, right=0)
return root