题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:
设定前序遍历序列为pre,中序遍历序列为tin;
1、首先我们先从前序遍历序列寻找root节点
2、递归过程
①前序遍历序列找到root节点后(pre[0])
②我们在中序遍历找到root结点,并记住其位置pos:
③如此我们将左子树和右子树分开:
左子树的前序遍历和中序遍历为:pre[1:pos+1]和tin[:pos]
右子树的前序遍历和中序遍历为:pre[pos+1:]和tin[jpos+1:]
同样在这里,我们要学会怎么构造二叉树,并且对我们的结果进行检查,我这里没有画图示意,以后有机会再补上。当然网上已经有这方面的总结,这篇博客总结的挺详细的,有兴趣可以去仔细钻研一下。
代码附上:
# -*- coding: utf-8 -*-
"""
Created on Sun Oct 15 15:38:21 2017
@author: gb_xiao
Mail: mingliumengshao@163.com
"""
"""
题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和
中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序
遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
"""
class TreeNode():
def __init__(self,x):
self.val = x
self.left = None
self.right = None
def function(pre, tin):
if len(pre) == 0:
return None
root = TreeNode(pre[0])
pos = tin.index(pre[0])
root.left = function(pre[1:pos+1],tin[:pos])
root.right = function(pre[pos+1:],tin[pos+1:])
return root
def Print_res(root,lists):
temp = root
if root == None:
return lists
Print_res(temp.left,lists)
Print_res(temp.right,lists)
lists.append(temp.val) return lists def main(): lists=[] pre = [1,2,4,7,3,5,6,8] tin = [4,7,2,1,5,3,8,6] root = function(pre, tin) print Print_res(root,lists) if __name__ == "__main__": main()