此题目对应于 105. Construct Binary Tree from Preorder and Inorder Traversal 和 106. Construct Binary Tree from Inorder and Postorder Traversal
题目要求:
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
这里必须给出两个遍历才可以重建二叉树,其中前序或者后续的遍历能给出树根节点的值,
中序遍历起到划分二叉树左右子树的作业。
距离说明:输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示的二叉树并输出它的头结点。
解题思路:
根据先序向量数组的值把中序向量数组一分为二,然后递归左右部分;
在二叉树的前序遍历和中序遍历的序列中确定根结点的值、左子树结点的值和右子树结点的值的步骤如下图所示:
下面给出Python代码:
# -*- coding:utf-8 -*-
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
'''
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
'''
class Solution(object):
# 根据前序和中序遍历重建二叉树
def buildTree(self, preorder, inorder):
if len(preorder)==0:
return None
if len(preorder)==1:
return TreeNode(preorder[0])
root_val = preorder[0]
idx = inorder.index(root_val)
root = TreeNode(root_val)
root.left = self.buildTree(preorder[1:idx+1],inorder[:idx])
root.right = self.buildTree(preorder[idx+1:],inorder[idx+1:])
return root
# 根据后序和中序遍历重建二叉树
def buildTree(self, inorder, postorder):
if len(inorder)==0:
return None
if len(inorder)==1:
return TreeNode(inorder[0])
root_v = postorder[-1]
root = TreeNode(root_v)
idx = inorder.index(root_v)
root.left = self.buildTree(inorder[:idx],postorder[:idx])
root.right = self.buildTree(inorder[idx+1:],postorder[idx:-1])
return root
"""
:type inorder: List[int]
:type postorder: List[int]
:rtype: TreeNode
"""
参考文献:
http://www.cnblogs.com/edisonchou/p/4741099.html