lintcode:Subtree 子树
题目:
有两个不同大小的二叉树: 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 子树的更多相关文章
- LintCode Subtree
原题链接在这里:http://www.lintcode.com/en/problem/subtree/ You have two every large binary trees: T1, with ...
- lintcode.245 子树
子树 描述 笔记 数据 评测 有两个不同大小的二进制树: T1 有上百万的节点: T2 有好几百的节点.请设计一种算法,判定 T2 是否为 T1的子树. 注意事项 若 T1 中存在从节点 n 开始 ...
- word20161221
S/MIME, Secure Multipurpose Internet Mail Extensions / 安全多用途网际邮件扩展协议 SACL, system access control lis ...
- Android版数据结构与算法(六):树与二叉树
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 之前的篇章主要讲解了数据结构中的线性结构,所谓线性结构就是数据与数据之间是一对一的关系,接下来我们就要进入非线性结构的世界了,主要是树与图,好了接 ...
- 因为强行关机, 而导致的fedora23 不能重新启动, 卡在开机logo那里的 修复 解决方案
其实, fedora23的U盘live 也很好用, 很流畅, 主要还是 要用一个比较好的/快的 U盘. 这样live U盘在4GB(3.75GiB)的内存中还是较快的 原来的U盘live系统用得很卡, ...
- 数据结构之线索二叉树——C语言实现
线索二叉树操作 (1) 线索二叉树的表示:将每个节点中为空的做指针与右指针分别用于指针节点的前驱和后续,即可得到线索二叉树. (2) 分类:先序线索二叉树,中序线索二叉树,后续线索二叉树 (3) 增 ...
- 【2016北京集训】Mushroom
Portal --> broken qwq Description 一开始有个蘑菇,蘑菇里面有\(n\)个房间,是一棵有根树,\(1\)号是根,每个房间里面都有杂草,现在要支持以下操作:将某个指 ...
- React 16 源码瞎几把解读 【三 点 一】 把react组件对象弄到dom中去(矛头指向fiber,fiber不解读这个过程也不知道)
一.ReactDOM.render 都干啥了 我们在写react的时候,最后一步肯定是 ReactDOM.render( <div> <Home name="home&qu ...
- 构建高可靠hadoop集群之4-权限指引
此文翻译自http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html ...
随机推荐
- asp.net mvc常用的数据注解和验证以及entity framework数据映射
终于有时间整理一下asp.net mvc 和 entity framework 方面的素材了. 闲话少说,步入正题: 下面是model层的管理员信息表,也是大伙比较常用到的,看看下面的代码大伙应该不会 ...
- (IIS8/8.5/Apache)301域名重定向
用Apache的.htaccess来做301域名转向1.开启apache支持.htaccess,方法:在Apache的配置文件httpd.conf中,找到<Directory /> ...
- opencv初体验
http://guoming.me/opencv-config 这篇文章有讲解opencv的安装与配置 一些常用库 opencv_core249d.lib opencv_imgproc249d.li ...
- 用开源AOP简化MVVM框架
本文的前提是知晓基于Xaml开发,本文以WPF为例 一 .简化属性通知事件 普通的属性通知会写一个基于INotifyPropertyChanged接口的类 public class RasieProp ...
- HTTP 错误 404.3 - Not Found
在使用win2012服务器上的IIS发布网页的时候,出现下面的错误 解决办法: 将应用程序开发下的所有功能都安装. 如果上面的方法没解决问题的话,那么看看下图中的这些安装没,没有的话就继续安装.
- 将Vim改造为强大的IDE
1.安装Vim和Vim基本插件 首先安装好Vim和Vim的基本插件.这些使用apt-get安装即可: lingd@ubuntu:~/arm$sudo apt-get install vim vim-s ...
- C++中的struct和class的区别
C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能.struct能包含成员函数吗? 能!struct能继承吗? 能!!stru ...
- 【nodejs】关于 alert 和 document
Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\Windows\system32>n ...
- iOS JSON解析
解析json成dic对象 -(void)fetchedData:(NSData*)responseData {//parse out the json dataNSError* error; NSDi ...
- input 标签的监听事件总结
最近在写一个手机端提交表单的项目,里面用了不少input标签,因为项目不太忙,所以,想做的完美点,但是遇到了一些问题,比如:页面中的必填项如果有至少一项为空,提交按钮就是不能提交的状态,所以需要对所有 ...