《程序员代码面试指南》第三章 二叉树问题 判断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用一个栈实现另一 ... 
随机推荐
- 奥巴马(Obama)获胜演讲全文[中英对照]+高清视频下载
			http://www.amznz.com/obama-speech/如果还有人对美国是否凡事都有可能存疑,还有人怀疑美国奠基者的梦想在我们所处的时代是否依然鲜活,还有人质疑我们的民主制度的力量,那么今 ... 
- C#中String.Empty、NULL与""三者的区别
			String.Empty和""是一样的,都是空,习惯用string.empty. Null和他们就有区别了,就是没有值,也没分配地址,此处可以理解成什么都没有. 
- PHP面试题及答案解析(6)—PHP网络编程
			1.禁用COOKIE后SEESION还能用吗? 可以,COOKIE和SESSION都是用来实现会话机制的,由于http协议是无状态的,所以要想跟踪一个用户在同一个网站之间不同页面的状态,需要有这么一个 ... 
- 征信报告页面的input验证收集
			https://ipcrs.pbccrc.org.cn/ function checkLoginName() { var loginName = $.trim($("#loginname&q ... 
- OpenCV for Python 学习笔记  三
			给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left, ... 
- [原创]个人工具 - 对APK极限压缩并对齐的工具(58.ReExtremeZipAndAlignAPK)
			2014年9月13日:RootExplorer_v2.21.1_Aligned对齐后:在华为U8860(2.3.6).酷派8150S(4.0.3)上安装滑动列表时,崩溃.原版本(已对齐)则OK.(不知 ... 
- ubuntu 16.04中卸载软件。
			今天装了个QQ,结果不会用,折腾了半天终于卸载掉了. dpkg -l | grep qq(查出安装的软件) 使用 sudo dpkg --purge xxx(这里xxx写查出来的软件包名字) 
- 查看文档的后几行命令:tail
			假如有一个文件test.txt,内容如下: [root@lee ~]# cat test.txt 这是第1行 这是第2行 这是第3行 这是第4行 这是第5行 这是第6行 这是第7行 这是第8行 这是第 ... 
- springMVC的注释集合
			SpringMVC的工作原理 主要核心实现是DispatcherServlet. 一般来讲客户端对服务器发送请求,是由DispatcherServlet控制的,DispatcherServlet接受到 ... 
- os模块,sys模块
			# os模块 # os模块是与操作系统交互的一个接口 ''' 和工作目录相关: os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径(在什么地方执行就是那个文件的路径) os ... 
