题目

判断t1 树中是否有与t2 树拓扑结构完全相同的子树

java代码

package com.lizhouwei.chapter3;

/**
* @Description: 判断t1 树中是否有与t2 树拓扑结构完全相同的子树
* @Author: lizhouwei
* @CreateDate: 2018/4/19 21:35
* @Modify by:
* @ModifyDate:
*/
public class Chapter3_12 { public boolean isSubTree(Node shead,Node mhead ){
String str1 =serialize(shead);
String str2 =serialize(mhead);
System.out.println("shead: "+str1);
System.out.println("mhead: "+str2); int res = KMP(str1, str2);
return res==-1?false:true;
}
//树的序列化
public String serialize(Node head) {
if (head == null) {
return "#!";
}
String res = head.value + "!";
res += serialize(head.left);
res += serialize(head.right);
return res;
} //KMP
public int KMP(String s, String m) {
if (s == null || m == null || m.length() > s.length()) {
return -1;
}
char[] ss = s.toCharArray();
char[] ms = s.toCharArray();
int[] next = getNext(ms);
int si = 0;
int mi = 0;
while (si < ss.length && mi < ms.length) {
if (ss[si] == ms[mi]) {
si++;
mi++;
} else if (next[mi] == -1) {
si++;
} else {
mi = next[mi];
}
}
return mi == ms.length ? si - mi : -1;
} public int[] getNext(char[] match) {
int len = match.length;
//next[i] 值为 {0,i-1}中,前缀子串和后缀子串 相等的最大长度
int[] next = new int[len];
//next[0] 前面没有元素,所以没有最大相等长度
next[0] = -1;
//next[1] 前面只有next[0]一个元素,
// 由于前子串不能包含最后一个,后缀子串不能包含第一个,所以其值为 0 ;
next[1] = 0;
int pos = 2;
// match[cn]表示 next[i-1]的最大前缀子串的后面一个字符,
// 当i=2时,next[2-1]=0,说明 match[1]在{0,0}中没有前缀子串;
//所以cn 从0 开始.
//cn 既可以表示 i-1的前缀子串和后缀子串的最大长度。
//也可表示 i-1的前缀子串的后面一个值得下标
int cn = 0;
while (pos < len) {
if (match[pos - 1] == match[cn]) {
next[pos++] = ++cn;
//++cn后,cn表示pos的前缀子串和后缀子串的最大长度。
} else if (cn > 0) {
//表示i-1的前缀子串的后面一个值得下标
cn = next[cn];
} else {
next[pos++] = 0;
}
}
return next;
} //测试
public static void main(String[] args) {
Chapter3_12 chapter = new Chapter3_12();
Node head1 = new Node(1);
head1.left = new Node(2);
head1.right = new Node(3);
head1.left.left = new Node(4);
head1.left.right = new Node(5); head1.right.left = new Node(6);
head1.right.right = new Node(7); head1.left.left.right = new Node(8);
head1.left.right.left = new Node(9);
Node head2 = new Node(2);
head2.left = new Node(4);
head2.right = new Node(5);
head2.left.right = new Node(8);
head2.right.left = new Node(9); Node head3 = new Node(2);
head3.left = new Node(4);
head3.right = new Node(5);
head3.left.right = new Node(8);
System.out.println("head1 是否包含head2 :" + chapter.isSubTree(head1, head2));
System.out.println("head1 是否包含head3 :" + chapter.isSubTree(head1, head3));
}
}

人生四大悲剧:穷的没钱做坏事,熟的没法做情侣,饿的不知吃什么,困得就是睡不着!

《程序员代码面试指南》第三章 二叉树问题 判断t1 树中是否有与t2 树拓扑结构完全相同的子树的更多相关文章

  1. 《程序员代码面试指南》第一章 栈和队列 最大值减去最小值小于或等于num的数量

    题目 给定整数数组arr和整数num,共返回多少的数组满足如下情况 max(arr[i...j]) - min(arr[i...j]) <= num max(arr[i...j])表示数组arr ...

  2. 《程序员代码面试指南》第一章 栈和队列 构造数组的MaxTree

    题目 给出一个无重复元素的数组,构造此数组的MaxTree, java代码 /** * @Description: 构造数组的MaxTree * @Author: lizhouwei * @Creat ...

  3. 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈

    题目 实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小的元素的操作 要求 1. pop.push.getMin操作时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 java代码 ...

  4. 《程序员代码面试指南》第二章 链表问题 将单链表每K个节点之间逆序

    样例 链表1-2-3-4-5-6-7-8-9-10 K=3 ,结果 3-2-1-6-5-4-9-8-7-10 java代码 /** * @Description:将单链表每K个节点之间逆序 * @Au ...

  5. 《程序员代码面试指南》第二章 链表问题 删除中间节点和a/b处节点

    题目 例如 1-2-3-4 删除2,1-2-3-4-5 删除3 例如 a=1,b =2 java代码 /** * @Description:删除中间节点和a/b处节点 * @Author: lizho ...

  6. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...

  7. [程序员代码面试指南]第9章-在两个长度相等的排序数组中找到第k小的数(二分)

    题目 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第k小的数. 题解 利用题目"在两个长度相等的排序数组中找到第上中位数"的函数 分类讨论 k < 1 ...

  8. 左神算法书籍《程序员代码面试指南》——3_05Morris遍历二叉树的神级方法【★★★★★】

    [问题]介绍一种时间复杂度O(N),额外空间复杂度O(1)的二叉树的遍历方式,N为二叉树的节点个数无论是递归还是非递归,避免不了额外空间为O(h),h 为二叉树的高度使用morris遍历,即利用空节点 ...

  9. 程序员代码面试指南:IT名企算法与数据结构题目最优解

      第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...

随机推荐

  1. 奥巴马(Obama)获胜演讲全文[中英对照]+高清视频下载

    http://www.amznz.com/obama-speech/如果还有人对美国是否凡事都有可能存疑,还有人怀疑美国奠基者的梦想在我们所处的时代是否依然鲜活,还有人质疑我们的民主制度的力量,那么今 ...

  2. C#中String.Empty、NULL与""三者的区别

    String.Empty和""是一样的,都是空,习惯用string.empty. Null和他们就有区别了,就是没有值,也没分配地址,此处可以理解成什么都没有.

  3. PHP面试题及答案解析(6)—PHP网络编程

    1.禁用COOKIE后SEESION还能用吗? 可以,COOKIE和SESSION都是用来实现会话机制的,由于http协议是无状态的,所以要想跟踪一个用户在同一个网站之间不同页面的状态,需要有这么一个 ...

  4. 征信报告页面的input验证收集

    https://ipcrs.pbccrc.org.cn/ function checkLoginName() { var loginName = $.trim($("#loginname&q ...

  5. OpenCV for Python 学习笔记 三

    给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left, ...

  6. [原创]个人工具 - 对APK极限压缩并对齐的工具(58.ReExtremeZipAndAlignAPK)

    2014年9月13日:RootExplorer_v2.21.1_Aligned对齐后:在华为U8860(2.3.6).酷派8150S(4.0.3)上安装滑动列表时,崩溃.原版本(已对齐)则OK.(不知 ...

  7. ubuntu 16.04中卸载软件。

    今天装了个QQ,结果不会用,折腾了半天终于卸载掉了. dpkg -l | grep qq(查出安装的软件) 使用 sudo dpkg --purge xxx(这里xxx写查出来的软件包名字)

  8. 查看文档的后几行命令:tail

    假如有一个文件test.txt,内容如下: [root@lee ~]# cat test.txt 这是第1行 这是第2行 这是第3行 这是第4行 这是第5行 这是第6行 这是第7行 这是第8行 这是第 ...

  9. springMVC的注释集合

    SpringMVC的工作原理 主要核心实现是DispatcherServlet. 一般来讲客户端对服务器发送请求,是由DispatcherServlet控制的,DispatcherServlet接受到 ...

  10. os模块,sys模块

    # os模块 # os模块是与操作系统交互的一个接口 ''' 和工作目录相关: os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径(在什么地方执行就是那个文件的路径) os ...