博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
还原二叉树
阅读量:6084 次
发布时间:2019-06-20

本文共 2402 字,大约阅读时间需要 8 分钟。

hot3.png

一、还原二叉树

      先序、中序

      后序、中序

二、先序和中序的还原

----------------------------------------------                            A		             / \			     B   C			    / \  / \			   D   E G  F           ----------------------------------------------
先序遍历结果:ABDECGF

中序遍历结果:DBEAGCF

先序中每个树的节点 左子树  相邻的节点但是要在先序中寻找的

                          右子树  先序中树的节点距离+先序中的位置 下一个就是右子树

例如:B   在先序 D [B] E

        B的下一个节点在左子树木中D可以找的到

                              右子树木中序B距离1 那么右子树在先序中+这个距离的下一个

/** * * 先序 中序 */public class ConstructBinaryTree {	public TreeNode buildTree(int[] preorder, int[] inorder) {	       return findTree(preorder,0,preorder.length-1,inorder,0,inorder.length-1);    }						public TreeNode findTree(int[] preorder,int preStart,int preEnd,int[] inorder,int inIndex,int inEnd){				         if(preStart>=preorder.length||inIndex>inEnd)				        	 return null;				         				         int i=inIndex;				         				         while(i<=inEnd){				             if(preorder[preStart]==inorder[i++])				            	 break;				         }				         				         TreeNode tn=new TreeNode(preorder[preStart]);				         		                 tn.left=findTree(preorder,preStart+1,preEnd,inorder,inIndex,i-2);		                 tn.right=findTree(preorder,preStart+i-inIndex,preEnd,inorder,i,inEnd);								return tn;			}				public static void main(String[] args) {			ConstructBinaryTree cbt=new ConstructBinaryTree();			cbt.buildTree(new int[]{1,2,3}, new int[]{1,2,3});		}}

三、后序和先序的还原

后序遍历结果:DEBGFCA

中序遍历结果:DBEAGCF

反过来就是啦 右子树就是左边的

                  左子树就是 左边开始+距离-1

/** * * 后序 中序 */public class ConstructBinaryTreeTwo {	public TreeNode buildTree(int[] inorder, int[] postorder) {	       return findTree(postorder,postorder.length-1,0,inorder,0,inorder.length-1);    }				public TreeNode findTree(int[] postorder,int postEnd,int postStart,int[] inorder,int inIndex,int inEnd){		   if(postEnd
inEnd) return null; int i=inIndex; while(i<=inEnd){ if(postorder[postEnd]==inorder[i++]) break; } TreeNode tn=new TreeNode(postorder[postEnd]); tn.left=findTree(postorder,postStart+(i-inIndex-1),postStart,inorder,inIndex,i-2); tn.right=findTree(postorder,postEnd-1,postStart+(i-inIndex-1),inorder,i,inEnd); return tn;} public static void main(String[] args) { ConstructBinaryTreeTwo cbt=new ConstructBinaryTreeTwo(); cbt.buildTree(new int[]{1,3,2}, new int[]{3,2,1}); }}

转载于:https://my.oschina.net/findurl/blog/403455

你可能感兴趣的文章
MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
查看>>
部署System Center App Controller 2012 Service Pack 1 (5)
查看>>
MySQL:日期函数、时间函数总结
查看>>
工作是什么
查看>>
Linux 中cpu通略
查看>>
服务器端创建账户收件箱规则--将邮件复制到指定文件夹中
查看>>
java中简单集合框架(二)
查看>>
函数返回局部变量的一些问题
查看>>
Solaris11性能监控--处理器
查看>>
内存模型
查看>>
如何快速开发网站?
查看>>
tomcat等服务器返回给页面的数字分别表示的意思!
查看>>
我的友情链接
查看>>
个人博客
查看>>
我的友情链接
查看>>
mysql 参数 innodb_flush_log_at_trx_commit
查看>>
Windows Server 2012 远程桌面,你需要具有通过远程桌面服务进行登录的权限
查看>>
Linux流量监控工具 – iftop
查看>>
【VMCloud云平台】SCCM(八)OSD(四)
查看>>
JavaTM Virtual Machine Profiler Interface (JVMPI)
查看>>