题目

判断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. PICT工具安装使用

    前言:PICT工具在微软公司出品一款成对组合的命令行生成工具.PICT 可有效地按照两两测试Pairwise的原理,进行测试用例设计.在使用PICT时,需要输入与测试用例相关的所有参数,以达到全面覆盖 ...

  2. Android源码在线查看网址

    1 http://www.grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/

  3. hibernate实现多变联合查询

    Hibernate主要支持两种查询方式:HQL查询和Criteria查询.前者应用较为广发,后者也只是调用封装好的接口. 现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么 ...

  4. ORACLE 表空间使用率查询

    SELECT A.TABLESPACE_NAME, A.BYTES / (1024 * 1024 * 1024 ) TOTAL, B.BYTES / (1024 * 1024 * 1024 ) USE ...

  5. Eclipse注释模板设置

    设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元 ...

  6. (2) yum源配置-163

    1.获取yum源文件 登录http://mirrors.163.com/.help/centos.html,查看CentOS6的链接地址(右键点击“CentOS6”,选择复制链接地址),链接地址为:h ...

  7. dede后台title怎么修改的?去掉XXXX-织梦内容管理系统V5.7

    dede后台title怎么修改的? 去掉XXXX-织梦内容管理系统V5.7 打开include/common.inc.php的文件. $cfg_version = 'V57_UTF8_SP1';(这是 ...

  8. VirtualBox + CentOS 虚拟机网卡配置

    摘要: 要学好Linux,还是得自己搭建虚拟机. VirtualBox比较小巧简单,容易上手.在配合CentOS 6.4使用时,首要的问题就是网卡配置,尤其是使用SSH终端仿真程序(例如SecureC ...

  9. jquery插件2

    1.很全,好用的jquery插件库:http://www.jq22.com/ 2.素材:http://www.sucaijiayuan.com/ 3.不错:http://www.helloweba.c ...

  10. C语言基础知识【判断】

    C 判断1.判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的).C 语言把任何非零和非空的值假定为 true,把零或 null ...