题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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):
# write code here
if not pre or not tin:
return None
root = TreeNode(pre[0])
count = 0
for i in tin:
if tin[count] != pre[0]:
count += 1
root.left = self.reConstructBinaryTree(pre[1:count+1], tin[:count])
root.right = self.reConstructBinaryTree(pre[count+1:], tin[count+1:])
return root
牛客网高玩答案
利用Python中list的pop方法和index方法,简洁高效!
# -*- 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):
# write code here
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