题目

判断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. Hive命令行经常使用操作(数据库操作,表操作)

    数据库操作 查看全部的数据库 hive> show databases ; 使用数据库default hive> use default; 查看数据库信息 hive > descri ...

  2. Ubuntu 12.04 的IP 设置

      通过访问 /etc/network/interfaces 实现动态IP 或者静态IP 的设置. vim /et/network/interfaces 1.设置动态IP auto lo iface ...

  3. ubuntu下设置静态ip

    直接修改系统配置文件ubuntu的网络配置文件是:/etc/network/interfacesubuntu命令行修改网络配置方法前面auto  eth?,让网卡开机自动挂载. 为网卡配置静态IP地址 ...

  4. Java GUI编程SwingUtilities.invokeLater作用

    1 http://blog.micxp.com/index.php/archives/109/ 2

  5. angularjs2中的非父子组件的通信

    AngualrJs2官方方法是以@Input,@Output来实现组件间的相互传值,而且组件之间必须父子关系,下面给大家提供一个简单的方法,实现组件间的传值,不仅仅是父子组件,跨模块的组件也可以实现传 ...

  6. IMSDroid问题集

    1.IMSDroid切换摄像头后的接收方横屏显示.事实上非常多种情况下都会突然发现就横屏了.解决的方法就是切换摄像头时同一时候切换横竖屏显示 2.IMSDroid掉音问题:IMSDroid通话几分钟后 ...

  7. SpringBoot启动流程分析(五):SpringBoot自动装配原理实现

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  8. 数据库操作事物的四大特性以及MySQL数据库的四种隔离级别

    1 .事物操作数据库的四大特性(ACID) 1.原子性 (Atomicity) 原子性:就是事物的所包含的所有操作,要么全部成功,要么全部失败回滚. 2.一致性 (Consistency) 一致性:简 ...

  9. Log4J 基本使用

    Log4j由三个重要的组件 构 成:日志 信息 的优先级,日志信息的输出目的地,日志信息的输出格式. 日志信息的优先级 从高到低有ERROR . WARN . INFO . DEBUG ,分别用来指定 ...

  10. 【文献阅读】Deep Residual Learning for Image Recognition--CVPR--2016

    最近准备用Resnet来解决问题,于是重读Resnet的paper <Deep Residual Learning for Image Recognition>, 这是何恺明在2016-C ...