题目描述
对于由一个二叉树得到的中序和前序遍历,根据这两个遍历得到的结果来得到整个树的结构。
简单思路
给定一个前序遍历,能够确定数的根节点,给定根节点和中序遍历能够确定根节点的左子树和右子树的中序遍历。同样也能够得到左子树和右子树的前序遍历。那么根据这样的想法进行递归。
举个例子:
代码
我的代码
class Solution:
def reConstructBinaryTree(self , pre, vin) :
# write code here
# pre: 前序
# vin: 中序
def get_tree_root(pre, vin):
root_node = TreeNode(pre[0])
root_index = vin.index(pre[0])
# 左子树的节点数量
left_num = root_index
# 左右子树的前序与中序
left_pre = pre[1:left_num+1]
left_vin = vin[:root_index]
right_pre = pre[left_num + 1:]
right_vin = vin[root_index+1:]
root_node.left = None
root_node.right = None
# 获得左右子树的根节点
if(len(left_pre)!=0):
root_node.left = get_tree_root(left_pre,left_vin)
if(len(right_pre)!=0):
root_node.right = get_tree_root(right_pre,right_vin)
return root_node
if(len(pre)==0):
return None
root_node = get_tree_root(pre,vin)
return root_node
运行时间:57ms 47.32%
内存:7036k 35.75%
别人的代码
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, vin):
# write code here
if pre == []:
return None
root = TreeNode(pre[0])
for i in range(len(vin)):
if vin[i] == pre[0]:
m = i
root.left = self.reConstructBinaryTree(pre[1:m+1], vin[:m])
root.right = self.reConstructBinaryTree(pre[m+1:], vin[m+1:])
return root
思路上是没有区别的,但代码上简洁了很多,同时也是自己实现index的。并且少了很多判断