《程序员代码面试指南》第三章 二叉树问题 判断t1 树中是否有与t2 树拓扑结构完全相同的子树
题目
判断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 树拓扑结构完全相同的子树的更多相关文章
- 《程序员代码面试指南》第一章 栈和队列 最大值减去最小值小于或等于num的数量
题目 给定整数数组arr和整数num,共返回多少的数组满足如下情况 max(arr[i...j]) - min(arr[i...j]) <= num max(arr[i...j])表示数组arr ...
- 《程序员代码面试指南》第一章 栈和队列 构造数组的MaxTree
题目 给出一个无重复元素的数组,构造此数组的MaxTree, java代码 /** * @Description: 构造数组的MaxTree * @Author: lizhouwei * @Creat ...
- 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈
题目 实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小的元素的操作 要求 1. pop.push.getMin操作时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 java代码 ...
- 《程序员代码面试指南》第二章 链表问题 将单链表每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 ...
- 《程序员代码面试指南》第二章 链表问题 删除中间节点和a/b处节点
题目 例如 1-2-3-4 删除2,1-2-3-4-5 删除3 例如 a=1,b =2 java代码 /** * @Description:删除中间节点和a/b处节点 * @Author: lizho ...
- 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点
题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...
- [程序员代码面试指南]第9章-在两个长度相等的排序数组中找到第k小的数(二分)
题目 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第k小的数. 题解 利用题目"在两个长度相等的排序数组中找到第上中位数"的函数 分类讨论 k < 1 ...
- 左神算法书籍《程序员代码面试指南》——3_05Morris遍历二叉树的神级方法【★★★★★】
[问题]介绍一种时间复杂度O(N),额外空间复杂度O(1)的二叉树的遍历方式,N为二叉树的节点个数无论是递归还是非递归,避免不了额外空间为O(h),h 为二叉树的高度使用morris遍历,即利用空节点 ...
- 程序员代码面试指南:IT名企算法与数据结构题目最优解
第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...
随机推荐
- 浅谈struts2标签中的2个非经常常使用的标签的使用方法(radio和select)
1.如图所看到的我们须要在前台的页面通过radio和select将相应的数据库中的数据显示到选项其中,这也是我们做项目中常常须要做的,动态的显示,而不是静态的显示. 首先我们须要在页面中导入strut ...
- windows 下编译64位ffmpeg
window下如何编译ffmpeg 前文已有介绍,前面介绍的都是如何编译32位的库,本文主要介绍window 下如何编译64位ffmpeg库. 一.搭建编译环境 1.下载 windows下编译64位F ...
- jQuery 遍历 - eq() 和siblings() 方法
eq() 方法将匹配元素集缩减值指定 index 上的一个. 通过为 index 为 2 的 div 加入适当的类.将其变为蓝色: <!DOCTYPE html> <html> ...
- EularProject 39:给周长推断构成直角三角形个数
华电北风吹 天津大学认知计算与应用重点实验室 完毕日期:2015/7/30 Integer right triangles Problem 39 If p is the perimeter of a ...
- [译]GLUT教程 - 修改菜单
Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Modifying Menus 肯定会有菜单需要被修改的状 ...
- hive中遇到的问题
) from t_1 where country ='China' group by (name = 'qq'); 结果图 select * from t_sz_part; 按照理解来说,应该只有一个 ...
- IE 下 log 调试的一点不同
介绍一点IE下控制台调试与chrome的区别 数组 alert([1,2]) console.log([1,2]) console.log([1,2],"1,2") alert I ...
- 托管程序调用非托管dll问题总结
托管程序Visual Basic.net, 非托管DLL标准C++程序(使用VC++编译) 函数调用定义 第一种写法: <DllImportAttribute("XXX.dll&quo ...
- 查看硬盘负载情况:iostat命令
Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况.同 ...
- poj1135
Domino Effect Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10454 Accepted: 2590 De ...