题目:

有两个不同大小的二叉树: 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. Hibernate中的对象状态,及自动更新原因

    Hibernate的对象有三种状态,分别为:瞬时状态 (Transient). 持久化状态(Persistent).游离状态(Detached).对它的深入理解,才能更好的理解hibernate的运行 ...

  2. IIFE-js中(function(){…})()立即执行函数写法理解

    介绍IIFE IIFE的性能 使用IIFE的好处 IIFE最佳实践 jQuery优化 在Bootstrap源码(具体请看<Bootstrap源码解析>)和其他jQuery插件经常看到如下的 ...

  3. selenium for python 所有方法

    先列出selenium所有方法,然后挨个使用!说明 add_cookieapplication_cachebackcapabilitiesclosecommand_executorcreate_web ...

  4. 每日一“酷”之difflib

    介绍:difflib 比较序列.该模块包含一些用来计算和处理序列直接差异的工具.她对于比较文本尤其用,其中包含的函数可以使用多种常用差异格式生成报告. 测试数据(splitlines()按行划分为序列 ...

  5. Azure Bill

    MSDN的本月订阅的被用完了,所有的付费订阅均变成了不可用的状态. 信用额度为0元,还有2天能恢复 点击上方的MSDN订阅名会进入更加详细的账单,账单以月的形式提供. 邮件中也会通知您到了限定额度所停 ...

  6. HDU 2669 第六周 I题

    Description The Sky is Sprite.  The Birds is Fly in the Sky.  The Wind is Wonderful.  Blew Throw the ...

  7. DATE,DATETIME,DATETIME2等日期时间数据类型

    日期范围广 0001-01-01 到 9999-12-31.时间范围广 00:00:00 到 23:59:59.9999999. -----------------DATE --只存储日期 selec ...

  8. linux下gcc编译的参数详细说明

    参考网址:1 http://hi.baidu.com/zengzhaonong/item/f1f9383565fa5c302e0f8125 gcc使用方法 汇总 2 http://s99f.blog. ...

  9. WPF-控件-层级控件-TreeView

    <?xml version="1.0" encoding="utf-8" ?> <Data xmlns=""> &l ...

  10. 【C#】索引器

    索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的. 索引器和数组比较: (1)索引器的索引值(Index)类型不受限制 (2)索引器允许重载 ...