子树

 

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

注意事项

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

您在真实的面试中是否遇到过这个题?

Yes
哪家公司问你的这个题? Airbnb Amazon LinkedIn Cryptic Studios Dropbox Apple Epic Systems TinyCo Yelp Hedvig Zenefits Uber Snapchat Yahoo Microsoft Bloomberg Google Twitter Facebook
感谢您的反馈
样例

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

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

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

  1. 1 3
  2. / \ \
  3. T1 = 2 3 T2 = 4
  4. /
  5. 4
  6.  
  7.  
  8. 很神奇的一道题,有个样例是{9999999.......},会卡住。
    就是说开始判断时,子树为空有的节点,树上也不能有,否则就不是子树了。一开始一直没想明白。
  9.  
  10. AC代码,
  1. /**
  2. * Definition of TreeNode:
  3. * class TreeNode {
  4. * public:
  5. * int val;
  6. * TreeNode *left, *right;
  7. * TreeNode(int val) {
  8. * this->val = val;
  9. * this->left = this->right = NULL;
  10. * }
  11. * }
  12. */
  13.  
  14. class Solution {
  15. public:
  16. /*
  17. * @param T1: The roots of binary tree T1.
  18. * @param T2: The roots of binary tree T2.
  19. * @return: True if T2 is a subtree of T1, or false.
  20. */
  21. bool isSubtree(TreeNode *T1, TreeNode *T2) {
  22. bool result = false;
  23. if (T2 == NULL)
  24. {
  25. return true;
  26. }
  27. if (T1 == NULL)
  28. {
  29. return false;
  30. }
  31.  
  32. if (T1->val == T2->val) {
  33. result = hasSubtree(T1,T2);
  34. }
  35. if (!result) {
  36. result = isSubtree(T1->left,T2);
  37. }
  38. if (!result) {
  39. result = isSubtree(T1->right,T2);
  40. }
  41. return result;
  42. }
  43.  
  44. bool hasSubtree(TreeNode *T1, TreeNode *T2)
  45. {
  46. if(T2==NULL && T1==NULL)
  47. return true;
  48.  
  49. if (T1 != NULL && T2!=NULL && T1->val == T2->val)
  50. {
  51. return hasSubtree(T1->left,T2->left) && hasSubtree(T1->right,T2->right);
  52. }
  53. return false;
  54. }
  55. };

  很尴尬的是,同样的代码,会runtime error。

代码如下:

  1. /**
  2. * Definition of TreeNode:
  3. * class TreeNode {
  4. * public:
  5. * int val;
  6. * TreeNode *left, *right;
  7. * TreeNode(int val) {
  8. * this->val = val;
  9. * this->left = this->right = NULL;
  10. * }
  11. * }
  12. */
  13. class Solution {
  14. public:
  15. /**
  16. * @param T1, T2: The roots of binary tree.
  17. * @return: True if T2 is a subtree of T1, or false.
  18. */
  19. bool isSubtree(TreeNode *T1, TreeNode *T2) {
  20. // write your code here
  21. bool res= false;
  22. if(T2 == NULL)
  23. return true;
  24. if(T1 == NULL)
  25. return false;
  26. if(T1 -> val == T2 -> val)
  27. res = cmp(T1,T2);
  28. if(!res)
  29. res=isSubtree(T1->left,T2);
  30. if(!res)
  31. res=isSubtree(T1->right,T2);
  32. return res;
  33. }
  34. bool cmp(TreeNode *T1,TreeNode *T2){
  35. if(T2 == NULL && T1 == NULL)
  36. return true;
  37. if(T1 -> val == T2 -> val && T1 != NULL && T2 != NULL)
  38. return cmp(T1->left,T2->left) && cmp(T1->right,T2->right);
  39. return false;
  40. }
  41. };

  

这就很尴尬了,我也不知道咋回事。。。求大佬指点

lintcode.245 子树的更多相关文章

  1. LintCode 子树

    easy 子树 19% 通过 有两个不同大小的二进制树: T1 有上百万的节点: T2 有好几百的节点.请设计一种算法.判定 T2 是否为 T1的子树. 您在真实的面试中是否遇到过这个题? Yes 例 ...

  2. lintcode:Subtree 子树

    题目: 子树 有两个不同大小的二叉树: T1 有上百万的节点: T2 有好几百的节点.请设计一种算法,判定 T2 是否为 T1的子树. 样例 下面的例子中 T2 是 T1 的子树: 1 3 / \ / ...

  3. LintCode题解之子树

    思路: 最简单的方法,依次遍历比较就可以了. AC代码: /** * Definition of TreeNode: * public class TreeNode { * public int va ...

  4. 245. Subtree【LintCode java】

    Description You have two very large binary trees: T1, with millions of nodes, and T2, with hundreds ...

  5. 子树(LintCode)

    子树 有两个不同大小的二进制树: T1 有上百万的节点:T2 有好几百的节点.请设计一种算法,判定 T2 是否为 T1的子树. 样例 下面的例子中 T2 是 T1 的子树: 1 3 / \ / T1 ...

  6. [LintCode]——目录

    Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...

  7. (lintcode全部题目解答之)九章算法之算法班题目全解(附容易犯的错误)

    --------------------------------------------------------------- 本文使用方法:所有题目,只需要把标题输入lintcode就能找到.主要是 ...

  8. leetcode & lintcode for bug-free

    刷题备忘录,for bug-free leetcode 396. Rotate Function 题意: Given an array of integers A and let n to be it ...

  9. leetcode & lintcode 题解

    刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...

随机推荐

  1. fodera20安装后的配置

    最近安装了Fedora 20 64bit,以下是一些优化配置,使之更适合国人使用. 1,安装gnome-tweak-tool设置工具 Fedora 19自带的系统设置工具十分简单,一些重要的地方都不能 ...

  2. JavaWeb(五)Filter过滤器

    Filter过滤器 Fileter介绍 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Serv ...

  3. Jsp/html页面删除前进行删除提示

    HTML代码 <body> <a href="javascript:if(window.confirm('是否?')){window.location.href='test ...

  4. 【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析

    异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待,或死循环. 异常有两个过程,一个是抛出异常:一个是捕捉异常. 抛出异常 抛出异常有三种形式,一是throw, ...

  5. java面向对象(五)之多态

    多态 面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. ...

  6. java面向对象(二)之继承

    继承 介绍 继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力.继承即常说的is-a关系.子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承 ...

  7. bugly cocos 接入和 符号表使用

    bugly cocos 接入和 符号表使用 在bugly网站下载 BuglyCocosPlugin 的sdk ios 1. 在 项目的 classes 里面新建 文件夹  BuglyCocosPlug ...

  8. maven 自我学习笔记

    1.常用网站: maven.apache.org http://mvnrepository.com/   2.命令 mvn -v 查看maven的版本 mvn -compile 在项目的根目录下编译项 ...

  9. [js高手之路]Vue2.0基于vue-cli+webpack Vuex用法详解

    在这之前,我已经分享过组件与组件的通信机制以及父子组件之间的通信机制,而我们的vuex就是为了解决组件通信问题的 vuex是什么东东呢? 组件通信的本质其实就是在组件之间传递数据或组件的状态(这里将数 ...

  10. [自制操作系统] 图形界面&VBE工具&MMIO显存&图形库/字库

    本文记录了在JOS(或在任意OS)上实现图形界面的方法与一些图形库的实现. 本文中支持的新特性: 支持基本图形显示 支持中英文显示(中英文点阵字库) 相关:VBE VESA MMIO 点阵字库 Git ...