还原本来的二叉树并不是一个非常简单的事,虽然思想比较简单,但过程却是比较繁琐。下面我拿先序序列和中序序列来讲一下原理吧。

从先序序列中我们一下子就可以得到二叉树的根节点是第一个元素,然后再中序序列中我们也可以找到这个元素(假设二叉树中所有的元素的值不相同)这样我们就可以把中序序列分成两部分,前部分和先序序列可求得左子树,后部分与先序序列可求得右子树。下面以左部分为例,在除去根节点的前序序列中的第二个元素,就是我们左子树的的第一个节点,然后继续在中序序列的前部分中找到相同的元素,再次对中序序列进行分割。····最后我们就可以得到恢复的二叉树了。

纯文字的讲述不太容易理解,下面我拿个具体的例子来分析吧。

比如

int[] preOrder = {7,10,4,3,1,2,8,11};  //前序序列
int[] inOrder = {4,10,3,1,7,11,8,2};  //中序序列

我们很容易在前序序列中得知7是根节点,接下来我们在中序序列中找到7所在的位置,那么此时4,10,3,1便是左子树对应的所有的节点。11,8,2是右子树所对应的所有的节点。

然后我们在前序序列中找到除根节点以外的第一个节点,那就是10,所以这就是左子树的第一个节点。然后我们在中序序列中找到10在第二个位置上,而10的左边有一个元素4,右边有3,1两个节点。这就说明4是节点10的左孩子节点,3,1为节点10的右子树上面的节点,然后再前序序列中我们便可以看出3是10的左孩子节点,而3的左边没有元素,说明3美誉哦左孩子节点,3的右边有一个元素1,说明3只有右孩子节点。至此,你是不是也掌握了恢复二叉树的方法了呢?

原理其实并不难理解,但是代码却不是特别好写。所以我拷贝了其他人做好的一份代码,大家一起欣赏一下吧。

package MyBinaryTree;

public class CreateBianryTreeByString {

        /**
         * Build Binary Tree from PreOrder and InOrder
         *  _______7______
           /              \
        __10__          ___2
       /      \        /
       4       3      _8
                \    /
                 1  11 

         */
        public static void main(String[] args) {
            CreateBianryTreeByString build=new CreateBianryTreeByString();
            int[] preOrder = {7,10,4,3,1,2,8,11};
            int[] inOrder = {4,10,3,1,7,11,8,2};  

            Node root=build.buildTreePreOrderInOrder(preOrder,0,preOrder.length-1,inOrder,0,preOrder.length-1);
            build.preOrder(root);
            System.out.println();
            build.inOrder(root);
        }  

        public Node buildTreePreOrderInOrder(int[] preOrder,int begin1,int end1,int[] inOrder,int begin2,int end2){
            if(begin1>end1||begin2>end2){
                return null;
            }
            int rootData=preOrder[begin1];
            Node head=new Node(rootData);
            int divider=findIndexInArray(inOrder,rootData,begin2,end2);
            int offSet=divider-begin2-1;
            Node left=buildTreePreOrderInOrder(preOrder,begin1+1,begin1+1+offSet,inOrder,begin2,begin2+offSet);
            Node right=buildTreePreOrderInOrder(preOrder,begin1+offSet+2,end1,inOrder,divider+1,end2);
            head.left=left;
            head.right=right;
            return head;
        }  

        public int findIndexInArray(int[] a,int x,int begin,int end){
            for(int i=begin;i<=end;i++){
                if(a[i]==x)return i;
            }
            return -1;
        }
        public void preOrder(Node n){
            if(n!=null){
                System.out.print(n.val+",");
                preOrder(n.left);
                preOrder(n.right);
            }
        }
        public void inOrder(Node n){
            if(n!=null){
                inOrder(n.left);
                System.out.print(n.val+",");
                inOrder(n.right);
            }
        }  

        class Node{
            Node left;
            Node right;
            int val;  

        public Node(int val){
            this.val=val;
        }
            public Node getLeft(){
                return left;
            }  

        public Node getRight(){
                return right;
            }  

        public int getVal(){
                return val;
            }  

        }
    }

测试结果:

7,10,4,3,1,2,8,11,//前序序列
4,10,3,1,7,11,8,2,//中序序列

最新文章

  1. python之OS模块详解
  2. 使用Python对Excel表格进行简单的读写操作(xlrd/xlwt)
  3. 盒模型--padding
  4. 怎样绘制ZBrush中的纹理
  5. Linux-insmod/rmmod/lsmod驱动模块相关命令(10)
  6. 10 Django RESTful api 实现匿名访问
  7. maven私库nexus2.11.4迁移升级到nexus3.12.0
  8. Linux CPU瓶颈问题分析
  9. AIOps 平台的误解,挑战及建议(中)— AIOps常见的误解
  10. Centos6.8 编译安装Apache2.4
  11. ansible-playbook &amp;&amp; Roles &amp;&amp; include
  12. 【Revit API】创建工作集并将element加入工作集中
  13. HDU-2829 Lawrence (DP+四边形不等式优化)
  14. 获取URL的数据
  15. iPhone 应用开发的5个贴士
  16. ubuntu登陆界面损坏修复
  17. 12.MySQL必知必会之分组数据
  18. Halcon学习之五:有关图像的定义域的函数
  19. 和菜鸟一起学android4.0.3源码之lcd屏幕背光调节
  20. 深刻理解JavaScript---闭包

热门文章

  1. IntelliJ IDEA 14.0.3 实战搭建Spring+SpringMVC+MyBatis组合框架
  2. 牛客网编程练习之PAT乙级(Basic Level):1041 说反话
  3. [BBS]搭建开源论坛之Jforum搭配开源CKEDITOR
  4. 20160216.CCPP体系详解(0026天)
  5. 奥比中光Orbbec Astra Pro RGBD 3D视觉传感器在ROS(indigo和kinetic)使用说明 rgb depth同时显示
  6. ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse
  7. Spark技术内幕:Shuffle Read的整体流程
  8. CoreAnimation中layer动画闪烁的原因及解决
  9. Nginx的负载均衡 - 保持会话 (ip_hash)
  10. 剑指Offer——简述堆和栈的区别