题目:105. 从前序与中序遍历序列构造二叉树
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 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, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
if len(preorder) == 0:
return None
node = TreeNode(preorder[0])
index = inorder.index(preorder[0])
node.left = self.buildTree(preorder[1: index + 1], inorder[:index])
node.right = self.buildTree(preorder[index + 1:], inorder[index + 1:])
return node