重构二叉树
来源:互联网 发布:程序员加油站 编辑:程序博客网 时间: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; } }
阅读全文
0 0
- 重构二叉树
- 重构二叉树
- 二叉树 重构
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 重构二叉树
- 3.重构二叉树
- 重构二叉树&&判断二叉树的子结构
- 根据二叉树遍历的结果重构二叉树
- ACM 重构二叉树 C++实现
- springboot整合jooq
- RSS从入门到精通
- git记录
- 关于android定位的坐标系问题
- MySQL DBA必备工具使用的6大锦囊妙计
- 重构二叉树
- Web百度地图显示多个标注点
- Android FOTA 升级流程
- Sublime Text3 如何安装插件?
- 欢迎使用CSDN-markdown编辑器
- 代码提交问题总结
- eclipse插件安装的方式
- STM32之USART串口接收数据处理
- 用ole读取excel时的参数解释