【剑指offer】面试题 7:重建二叉树

来源:互联网 发布:九院吴巍 知乎 编辑:程序博客网 时间:2024/06/03 19:30

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

时间限制:1秒 空间限制:32768K 热度指数:162011


思路:由前序遍历可以知道二叉树的根节点,而后序遍历中根节点是在中间的,所以可以知道中序遍历的根节点前面的数字都是二叉树的左子树,根节点后面的都是二叉树的右子树。得到左子树、右子树的前序遍历和中序遍历后,我们可以用递归的方式来完成构建左、右子树。


参考代码

'''输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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 = xself.left = Noneself.right = Noneclass Solution:# 返回构造的 TreeNode 根节点def reConstructBinaryTree(self, pre, tin):# write code hereif not pre and not tin:return Noneroot = TreeNode(pre[0])if set(pre) != set(tin):return Nonei = tin.index(pre[0]) # 查找第一次出现节点的位置,并返回位置# pre[1:i+1], tin[:i] 表示的是二叉树的左子树部分root.left = self.reConstructBinaryTree(pre[1 : i + 1], tin[ : i])# pre[i+1:], tin[i+1:] 表示的是二叉树的右子树部分root.right = self.reConstructBinaryTree(pre[i + 1 : ], tin[i + 1 : ])return rootpre = [1, 2, 4, 7, 3, 5, 6, 8]# 前序遍历tin = [4, 7, 2, 1, 5, 3, 8, 6]# 中序遍历test = Solution()newTree = test.reConstructBinaryTree(pre, tin)# 生成新的二叉树# 按层序遍历输出树中某一层的值def PrintNodeAtLevel(treeNode, level):if not treeNode or level < 0:return 0if level == 0:print(treeNode.val)return 1PrintNodeAtLevel(treeNode.left, level - 1)PrintNodeAtLevel(treeNode.right, level - 1)# 已知树的深度按层级遍历输出树的值def PrintNodeByLevel(treeNode, depth):for level in range(depth):PrintNodeAtLevel(treeNode, level)PrintNodeByLevel(newTree, 4)


原创粉丝点击