求一个二叉树是否为另一个二叉树的子树
2016-07-02 21:19
337 查看
**对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。
给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。**
直接把两个二叉树通过前序遍历形成字符串,在判断字符串A是否包含字符串B,主要用到的是KMP算法(http://blog.csdn.net/maotianwang/article/details/34466483)。
感觉表达有欠缺,不明白的地方可以点击上面的链接查看 /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } }*/ public class IdenticalTree { StringBuffer buffer=new StringBuffer(); StringBuffer buffer2=new StringBuffer(); public boolean chkIdentical(TreeNode A, TreeNode B) {//传进来两个二叉树A、B String a=change(A);//递归,前序遍历二叉树,得到字符串 String b=change(B); int i=getIndexOf(a,b);//判断a是否包括b if(i==-1) return false; return true; } public int getIndexOf(String A,String B){ if(B.length()>A.length()) return -1; int[] next=getIndex(B); char[] a=A.toCharArray(); char[] b=B.toCharArray(); int i=0;int j=0; while(j<b.length&&i<a.length){ if(a[i]==b[j]){//相等的话,AB字符串一起向前推进 i++; j++; }else if(next[j]==-1){//代表B仍然比较第一个字符,因为next[0]=-1 i++; }else{//如果B比较i+1不相等,这得到i的最大公共部分,将A继续和B第next[i]进行比较,相当于将A向前动 //i-next[i]个,如ABCABE,ABCABD,第6个不一样,但前五个,公共部分长度为2,这将ABCABE中E和 //ABCABD中C进行比较,相当于ABCABE向前推动i-next[i]个。 j=next[j]; } } if(j==b.length)//如果长度一样,这代表匹配到最后一个,成功 return 0; return -1; } public int[] getIndex(String a){ char[] b=a.toCharArray(); int[] next=new int[b.length+1]; next[0]=-1; next[1]=0; int cur=2;//从字符串第二个字符算起 int cn=0; while(cur<next.length){ if(b[cur-1]==b[cn]){//因为next[1]是确定的,比较第2个和第next[1]字符,即第cur-1个和第next[cur-1] cn++;//如果一样,则公共部分长度+1, next[cur]=cn; cur++; }else if(cn>0){//如果cn>0,代表之前有公共的部分,这将之前继续求公共部分,如 //abacaba一样,前缀aba后缀aba,比较aba的前缀ab中b和abacaba下个字符,因aba=aba,所以a=a=a=a,则第一个和最后一个相等 cn=next[cn]; }else{//若没有,则代表目前公共部分长度为0 next[cur]=0; cur++; } }return next; } public String change(TreeNode tree){//递归,前左右,然后细分,将左边继续前左右分,右边,前左右分,累计 if(tree==null) { return "#"; } StringBuilder sb=new StringBuilder(); sb.append(tree.val); sb.append(change(tree.left)); sb.append(change(tree.right)); return sb.toString(); } }
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- 书评:《算法之美( Algorithms to Live By )》
- 注册表的组织结构
- 动易2006序列号破解算法公布
- Ruby on Rails所构建的应用程序基本目录结构总结
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- SQLSERVER的非聚集索引结构深度理解
- 调整SQLServer2000运行中数据库结构
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#基础语法:结构和类区别详解
- 深入c# 类和结构的区别总结详解
- c#结构和类的相关介绍
- C#中结构(struct)的部分初始化和完全初始化实例分析
- 算法练习之从String.indexOf的模拟实现开始