重建二叉树
来源:互联网 发布:指针可以当数组用吗 编辑:程序博客网 时间:2024/05/21 07:29
输入某二叉树的前序遍历和中序遍历结果,重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,6,6},则重建出该二叉树并输出它的头结点。
在二叉树的前序遍历序列中,第一个数字总是根节点的值。但在中序遍历序列中,根节点的值位于序列的中间,左子树节点的值位于根节点左边,右子树节点的值位于根节点右边。因此我们需要扫描中序遍历序列,才能找到根节点的值。
找到根节点之后,我们可以确定左右子树节点的值,也得到了左右子树的前序和中序遍历序列,接下来的事情可以用递归完成。
class Node{int data;Node lChild;Node rChild;}public class Main{public static void main(String[] args) {int[] pre={1,2,4,7,3,5,6,8}; //先序遍历数组int[] in={4,7,2,1,5,3,6,6}; //中序遍历数组int length=pre.length;Node root=construct(pre,in,0,length-1,0,length-1);System.out.println(root.data);}public static Node construct(int[] pre, int[] in, int startPre,int endPre,int startIn,int endIn) {if(startPre>endPre||startIn>endIn){ //没有左孩子或右孩子return null;}Node root=new Node(); root.data=pre[startPre]; //先序遍历第一个元素即为根节点if(startPre==endPre||startIn==endIn){return root;}int rootIndex;for(rootIndex=startIn;rootIndex<=endIn;rootIndex++){ //找出中序遍历中根节点位置if(in[rootIndex]==pre[startPre])break;}//根据中序遍历根节点的位置,构造左右子树//递归构建左子树root.lChild=construct(pre,in,startPre+1,startPre+rootIndex-startIn,startIn,rootIndex-1);//递归构建右子树root.rChild=construct(pre,in,startPre+rootIndex-startIn+1,endPre,rootIndex+1,endIn);return root;}}
0 0
- 3.9重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 二叉树的重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- C++指针和数组和动态分配内存
- 关于火狐浏览器IE浏览器的各种submit提交无效的问题
- 俄罗斯军事装备 苏——15
- 多布局的优化
- Spring配置数据源的三种方式 (dbcp,c3p0,jndi).
- 重建二叉树
- python爬虫中的 urllib 模块 浅析
- 搭建DAO层和Service层代码
- logback性能优化及源码分析
- Android判断机器是否联网
- #97 Maximum Depth of Binary Tree
- Swift-- 计算文字尺寸
- HashSet实现原理-源码调试
- C3P0连接池详解及配置