题目
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解(迭代 使用类似排序树的方法定位结点位置)
# -*- coding:utf-8 -*-
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
# 创建结果树根
newT = None
# 快速查找表 根据在中序表中的下标,判断“大小”
dic = {tin[v]:v for v in range(0, len(tin))}
# 插入方法 类似排序树
def insert(newT, x):
temT = newT
oldT = temT
rf = 0
while temT != None:
oldT = temT
if dic[temT.val] > dic[x]:
temT = temT.left
rf = 1
else:
temT = temT.right
rf = 2
nt = TreeNode(x)
if rf == 0:
newT = nt
elif rf == 1:
oldT.left = nt
else:
oldT.right = nt
return newT
# 前序插入 不会出现在非叶子结点插入的情况
for x in pre:
newT = insert(newT, x)
# 返回
return newT
解(分治递归)
# -*- coding:utf-8 -*-
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def reConstructBinaryTree(self, pre, tin):
if not pre or not tin:
return None
root = TreeNode(pre.pop(0)) # 生成结点
index = tin.index(root.val) # 在中序表中定位 划分左右子树
root.left = self.reConstructBinaryTree(pre, tin[:index])
root.right = self.reConstructBinaryTree(pre, tin[index + 1:])
return root