题目

判断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. Docker iptables failed: iptables -t nat -A DOCKER -p tcp

    Dokcer网络问题 因为操作或修该过iptables导致docker容器出现如下错误: [root@mysqlserver ~]# docker restart cvnavi-centos-tomc ...

  2. Ffmpeg音频转码 卡顿(MP2转AAC)

    最好经手一个小的功能将mp2实时流转成AAC并发布成rtmp音频流,本身不是很难的一个需求, 一个晚上就能将功能开发好.功能开发完毕后,找来一音频文件利用Ffmpeg命令将音视频文件推成 实时udp格 ...

  3. windows 下编译64位ffmpeg

    window下如何编译ffmpeg 前文已有介绍,前面介绍的都是如何编译32位的库,本文主要介绍window 下如何编译64位ffmpeg库. 一.搭建编译环境 1.下载 windows下编译64位F ...

  4. 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获

    项目开发中的一些注意事项以及技巧总结   1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...

  5. 读书报告之《改动代码的艺术》 (I)

    <改动代码的艺术>,英文名<Working Effectively with Legacy Code>,中文翻译的文笔上绝对谈不上"艺术"二字.愧对艺术二字 ...

  6. ssh隧道远程连接mysql

    有时候比如一些云主机,没有开放3306端口,这里可以用ssh隧道来连接数据库,更加安全 注意点: 1.本地ssh可以登录远程服务器,(密码或者秘钥) 2.远程数据库需要赋权限给隧道端的ip 命令: s ...

  7. spring的xml配置文件出现故障

    今天在断网的情况下,spring的applicationContext.xml文件开头部分出现红叉 <span style="font-size:18px;">< ...

  8. Spring Cloud Zuul 网关的分布式系统中整合Swagger(转)和 zuul跨域访问问题

    首先恭喜自己终于找对了努力的方向,很荣幸能在公司接触到微服务架构,也很高兴公司一个大佬哥们愿意带我,他技术确实很牛逼,我也很佩服他,前后端通吃,干了六年能有这样的水平.最近跟着在搞微服务架构,给我分配 ...

  9. 微信支付v3开发(6) 收货地址共享接口

    请看新版教程  微信支付开发(7) 收货地址共享接口V2 本文介绍微信支付下的收货地址共享接口的开发过程. 一. 简单介绍 微信收货地址共享,是指用户在微信浏览器内打开网页,填写过地址后,兴许能够免填 ...

  10. UFLDL深度学习笔记 (六)卷积神经网络

    UFLDL深度学习笔记 (六)卷积神经网络 1. 主要思路 "UFLDL 卷积神经网络"主要讲解了对大尺寸图像应用前面所讨论神经网络学习的方法,其中的变化有两条,第一,对大尺寸图像 ...