题目:

有两个不同大小的二叉树: T1 有上百万的节点; T2 有好几百的节点。请设计一种算法,判定 T2 是否为 T1的子树。

样例

下面的例子中 T2 是 T1 的子树:

       1                3
/ \ /
T1 = 2 3 T2 = 4
/
4

下面的例子中 T2 不是 T1 的子树:

       1               3
/ \ \
T1 = 2 3 T2 = 4
/
4
注意

若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 是 T1 的子树。也就是说,如果在 T1 节点 n 处将树砍断,砍断的部分将与 T2 完全相同。

解题:

感觉通过直接递归就可以解决,但是下面的程序运行到60%的测试数据结果就不对了

Java程序:

/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param T1, T2: The roots of binary tree.
* @return: True if T2 is a subtree of T1, or false.
*/
public boolean isSubtree(TreeNode T1, TreeNode T2) {
// write your code here
if(T1==null && T2==null)
return true;
if(T1==null)
return false;
if(T2==null)
return true;
if(T1.val==T2.val&& T1.left==null && T2.left==null && T1.right==null && T2.right==null)
return true; if(T1.val!=T2.val){
boolean lft = isSubtree(T1.left,T2);
boolean rit = isSubtree(T1.right,T2);
if(lft || rit)
return true;
}else{
boolean lft = isSubtree(T1.left,T2.left);
boolean rit = isSubtree(T1.right,T2.right);
if(lft && rit)
return true;
}
return false;
}
}

上面的程序中,当当前节点相同和不相同的时候,都是自身递归,在网上看到,对应节点相同的时候,要单独搞个递归判断

基本流程:

若T1.val!=T2.val,分布判断两个子树是否和T2相等,只有有一个相等就可以

若T1.val==T2.val,判断是否相等,若不相等,分布对其两个子树再判断

上面程序,可以感觉到走了个圈。

网上有的程序写的很简单。。。

Java程序:

/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param T1, T2: The roots of binary tree.
* @return: True if T2 is a subtree of T1, or false.
*/
public boolean isSubtree(TreeNode T1, TreeNode T2) {
// write your code here
if(T1==null && T2==null)
return true;
if(T1==null)
return false;
if(T2==null)
return true; if(T1.val!=T2.val){
boolean lft = isSubtree(T1.left,T2);
boolean rit = isSubtree(T1.right,T2);
if(lft || rit)
return true;
}else{
boolean res = isEqual(T1,T2);
if(res)
return true;
else {
boolean lft = isSubtree(T1.left,T2);
boolean rit = isSubtree(T1.right,T2);
if(lft || rit)
return true;
}
}
return false;
}
public boolean isEqual(TreeNode T1,TreeNode T2){
if(T1==null && T2==null)
return true;
if(T1==null)
return false;
if(T2==null)
return false;
if(T1.val==T2.val){
boolean lft = isEqual(T1.left,T2.left);
boolean rit = isEqual(T1.right,T2.right);
if(lft && rit)
return true;
}
return false;
}
}

总耗时: 5048 ms

上面的程序又部分冗余,现在修改如下,时间也少了好多

/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param T1, T2: The roots of binary tree.
* @return: True if T2 is a subtree of T1, or false.
*/
public boolean isSubtree(TreeNode T1, TreeNode T2) {
// write your code here
if(T1==null && T2==null)
return true;
if(T1==null)
return false;
if(T2==null)
return true; if(T1.val==T2.val){
boolean res = isEqual(T1,T2);
if(res)
return true;
} boolean lft = isSubtree(T1.left,T2);
if(lft==true)
return true;
boolean rit = isSubtree(T1.right,T2);
return rit;
}
public boolean isEqual(TreeNode T1,TreeNode T2){
if(T1==null && T2==null)
return true;
if(T1==null)
return false;
if(T2==null)
return false;
if(T1.val==T2.val){
boolean lft = isEqual(T1.left,T2.left);
boolean rit = isEqual(T1.right,T2.right);
if(lft && rit)
return true;
}
return false;
}
}

Java Code

总耗时: 3461 ms

Python程序:

"""
Definition of TreeNode:
class TreeNode:
def __init__(self, val):
self.val = val
self.left, self.right = None, None
"""
class Solution:
# @param T1, T2: The roots of binary tree.
# @return: True if T2 is a subtree of T1, or false.
def isSubtree(self, T1, T2):
# write your code here
if(T1==None and T2==None):
return True
if T1==None:
return False
if T2==None:
return True
if T1.val!=T2.val:
lft = self.isSubtree(T1.left,T2)
rit = self.isSubtree(T1.right,T2)
if lft or rit:
return True
else:
res = self.isEqual(T1,T2)
if res:
return True
else:
lft = self.isSubtree(T1.left,T2)
rit = self.isSubtree(T1.right,T2)
if lft or rit:
return True
return False def isEqual(self,T1,T2): if T1==None and T2==None:
return True
if T1==None:
return False
if T2==None:
return False
if T1!=None and T2!=None and T1.val==T2.val:
lft = self.isEqual(T1.left,T2.left)
rit = self.isEqual(T1.right,T2.right)
if lft and rit:
return True
return False

总耗时: 640 ms

lintcode:Subtree 子树的更多相关文章

  1. LintCode Subtree

    原题链接在这里:http://www.lintcode.com/en/problem/subtree/ You have two every large binary trees: T1, with ...

  2. lintcode.245 子树

    子树   描述 笔记 数据 评测 有两个不同大小的二进制树: T1 有上百万的节点: T2 有好几百的节点.请设计一种算法,判定 T2 是否为 T1的子树. 注意事项 若 T1 中存在从节点 n 开始 ...

  3. word20161221

    S/MIME, Secure Multipurpose Internet Mail Extensions / 安全多用途网际邮件扩展协议 SACL, system access control lis ...

  4. Android版数据结构与算法(六):树与二叉树

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 之前的篇章主要讲解了数据结构中的线性结构,所谓线性结构就是数据与数据之间是一对一的关系,接下来我们就要进入非线性结构的世界了,主要是树与图,好了接 ...

  5. 因为强行关机, 而导致的fedora23 不能重新启动, 卡在开机logo那里的 修复 解决方案

    其实, fedora23的U盘live 也很好用, 很流畅, 主要还是 要用一个比较好的/快的 U盘. 这样live U盘在4GB(3.75GiB)的内存中还是较快的 原来的U盘live系统用得很卡, ...

  6. 数据结构之线索二叉树——C语言实现

     线索二叉树操作 (1) 线索二叉树的表示:将每个节点中为空的做指针与右指针分别用于指针节点的前驱和后续,即可得到线索二叉树. (2) 分类:先序线索二叉树,中序线索二叉树,后续线索二叉树 (3) 增 ...

  7. 【2016北京集训】Mushroom

    Portal --> broken qwq Description 一开始有个蘑菇,蘑菇里面有\(n\)个房间,是一棵有根树,\(1\)号是根,每个房间里面都有杂草,现在要支持以下操作:将某个指 ...

  8. React 16 源码瞎几把解读 【三 点 一】 把react组件对象弄到dom中去(矛头指向fiber,fiber不解读这个过程也不知道)

    一.ReactDOM.render 都干啥了 我们在写react的时候,最后一步肯定是 ReactDOM.render( <div> <Home name="home&qu ...

  9. 构建高可靠hadoop集群之4-权限指引

    此文翻译自http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html ...

随机推荐

  1. 【Qt】Qt之进程间通信(IPC)【转】

    简述 进程间通信,就是在不同进程之间传播或交换信息.那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区.但是,系统空间却是“ ...

  2. 重拾C,一天一点点_6

    break与continuecontinue只能用于循环语句goto最常见的用法是终止程序在某些深度嵌套的结构中的处理过程,例如一次跳出两层或多层循环.break只能从最内层循环退出到上一级的循环. ...

  3. 如何去掉html中的超链接

    $a= preg_replace("/<a[^>]+>/", "", $a); $a= preg_replace("/<\/a ...

  4. CSS练习

    看到一个CSS参考手册:http://css.doyoe.com/ 感谢感谢!

  5. JSON对象配合jquery.tmpl.min.js插件,手动攒出一个table

    jquery.tmpl.min.js 首先下载这个插件 1.绑定json那头的键 //TemplateDDMX 这个是这段JS的ID,这个必须写!!!!!! //${}为json的键的值,必须要填写正 ...

  6. git add 命令详解

    或"表示git会例出索引库中的文件列表中的第个文件."-"表示git会例出索引库中的文件列表中的第个文件到第个文件.回车将执行.如果我们不输入任何东西,直接回车,将结束r ...

  7. Google protobuf安装

    1:需要安装sudo apt-get install x11-apps libwayland-ltst-client0 libtxc-dxtn-s2tc0 x11-session-utils  x11 ...

  8. Python实战(2)

    在安装python第三方插件库的时候遇到了这个错误 遇到这种问题可以”转战“国内的第三方镜像,问题便可迎刃而解.例如豆瓣镜像——http://pypi.douban.com/simple/ 先安装ea ...

  9. UIViewController没有随着设备一起旋转的原因

    对于iPhone app,UIViewController类提供了基本的视图管理模式.当设备改变方向的时候view controller的视图会自动随之旋转的.如果视图和子视图的autoresizin ...

  10. cocos2dx中的坐标体系

    1.UI坐标系和GL坐标系 2.本地坐标与世界坐标 本地坐标是一个相对坐标,是相对于父节点或者你指明的某个节点的相对位置来说的,本地坐标的原点在参考节点的左下角 世界坐标是一个绝对的坐标,是以屏幕的左 ...