重构二叉树

来源:互联网 发布:程序员加油站 编辑:程序博客网 时间:2024/06/05 02:00

已知前序中序、中序后序二叉树序列重构二叉树

package Test;import java.util.LinkedList;/*1 *            2   3 *          4 5  6 *           7     8  *//*****************************重构二叉树*************************************/public class Mytest2 {public static void main(String[] args){int pre[]={1,2,4,7,3,5,6,8};//前序int in[]={4,7,2,1,5,3,8,6};//中序int back[]={7,4,2,5,8,6,3,1};//后序//已知前序和中序//TreeNode head=reConstructBinaryTree(pre,in);//BreadthFirst(head);     //对应输出应该为 1,2,3,4,5,6,7,8;//已知中序和后序TreeNode head1=reConstructTree(back,in);BreadthFirst(head1);   }/************************************************************************ * int[] pre 前序二叉树 * int[] in  中序二叉树 */public static TreeNode reConstructBinaryTree(int [] pre,int [] in)    {        TreeNode head=null;        if(pre.length==0||in.length==0)            return null;        else            {head=rebuileTree(head,head,pre,in,0,pre.length-1,0,in.length-1);        }        return head;    }public static TreeNode rebuileTree(TreeNode head,TreeNode node,int []pre,int []in,int Lstart,int Lend,int Rstart,int Rend)//先序范围在前,中序范围在后        {        int value=pre[Lstart];//先序中确定根节点 ----序列开始的第一个元素        int k=findNode(value,in,Rstart,Rend);//在中序中查找该节点,返回索引            if(node==null)            {                node=new TreeNode(value);                head=node;                System.out.println("根"+value);            }        int Lnum=k-Rstart;//从中序子列中得到左子树节点个数        int Rnum=Rend-k;//从中序子列中得到右子树节点个数        System.out.println("value"+value);        System.out.println("k="+k+" "+"Lnum="+Lnum+" "+"Rnum="+Rnum);        TreeNode temp=node;        if(Lnum>0)                {                System.out.println("左"+pre[Lstart+1]);                temp.left=new TreeNode(pre[Lstart+1]);        rebuileTree(head,temp.left,pre,in,Lstart+1,Lstart+Lnum,Rstart,k-1);//左子树                 }        if(Rnum>0)               {            System.out.println("右"+pre[Lstart+Lnum+1]);            temp.right=new TreeNode(pre[Lstart+Lnum+1]);        rebuileTree(head,temp.right,pre,in,Lstart+Lnum+1,Lstart+Lnum+Rnum,k+1,Rend);//右子树            }        return head;}    public static int findNode(int value,int []in,int start,int end)//在中序范围内进行查找        {        int mid=0;        for(int i=start;i<=end;i++)        if(value==in[i])        {        mid=i;        break;        }        return mid;}    /***************************广度优先遍历*******************************/    public static void BreadthFirst(TreeNode head){TreeNode p=head;LinkedList<TreeNode> list=new LinkedList<TreeNode>();//链表存储未访问过的节点if(p!=null){list.add(p);//首先将根节点加入队列while(!list.isEmpty())//非空{p=list.poll();//弹出队列头部元素,并判断有没字节点,有的话就加入队列中System.out.print(p.val+" ");if(p.left!=null){list.add(p.left);}if(p.right!=null){list.add(p.right);}}}}    /*******************从后序和中序书序列重构二叉树****************************************     *      * @param back  后序树序列     * @param in中序树序列     * @return     */    public static TreeNode reConstructTree(int []back,int [] in)    {        TreeNode head=null;        if(back.length==0||in.length==0)            return null;        else            {head=rebuileTree1(head,head,back,in,0,back.length-1,0,in.length-1);        }        return head;    }    public static TreeNode rebuileTree1(TreeNode head,TreeNode node,int []back,int []in,int Lstart,int Lend,int Rstart,int Rend)//后序范围在前,中序范围在后        {        int value=back[Lend];//后序中确定根节点 ---序列中最后的一个元素        int k=findNode(value,in,Rstart,Rend);//在中序中查找该节点,返回索引            if(node==null)            {                node=new TreeNode(value);                head=node;                System.out.println("根"+value);            }        int Lnum=k-Rstart;//从中序子列中得到左子树节点个数        int Rnum=Rend-k;//从中序子列中得到右子树节点个数        System.out.println("value"+value);        System.out.println("k="+k+" "+"Lnum="+Lnum+" "+"Rnum="+Rnum);        TreeNode temp=node;        if(Lnum>0)                {                System.out.println("左"+back[Lend-Rnum-1]);                temp.left=new TreeNode(back[Lend-Rnum-1]);        rebuileTree1(head,temp.left,back,in,Lend-Rnum-Lnum,Lend-Rnum-1,Rstart,k-1);//左子树                 }        if(Rnum>0)               {            System.out.println("右"+back[Lend-1]);            temp.right=new TreeNode(back[Lend-1]);        rebuileTree1(head,temp.right,back,in,Lend-Rnum,Lend-1,k+1,Rend);//右子树            }        return head;}}class TreeNode { int val;     TreeNode left;//     TreeNode right;//初始化时null     TreeNode(int x) { val = x; } }


原创粉丝点击