lintcode——子树
来源:互联网 发布:it运维管理软件 编辑:程序博客网 时间:2024/05/19 20:37
1、题目
有两个不同大小的二进制树: T1
有上百万的节点; T2
有好几百的节点。请设计一种算法,判定T2
是否为T1
的子树。
注意事项
若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 是 T1 的子树。也就是说,如果在 T1 节点 n 处将树砍断,砍断的部分将与 T2 完全相同。
样例
下面的例子中 T2 是 T1 的子树:
1 3 / \ / T1 = 2 3 T2 = 4 / 4
下面的例子中 T2 不是 T1 的子树:
1 3 / \ \T1 = 2 3 T2 = 4 / 4
2、思路
当T2为空时它一定是T1的子树;当两棵树非空时,如果满足T2是T1的子树,T2的根节点值一定是与T1中某个节点值相等,所以需要先找出相同的节点值,再对以该节点为根的子树判断是否等价(类似判断等价二叉树)。
3、代码
/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */class Solution {public: /** * @param T1, T2: The roots of binary tree. * @return: True if T2 is a subtree of T1, or false. */ bool judge(TreeNode *T1,TreeNode *T2) { if(T1==NULL&&T2==NULL) return true; if(T1!=NULL&&T2==NULL||T1==NULL&&T2!=NULL) return false; if(T1->val==T2->val) { return judge(T1->left,T2->left)&&judge(T1->right,T2->right); } return false; } bool isSubtree(TreeNode *T1,TreeNode *T2) { // write your code here if(T2==NULL) return true; if(T1==NULL) return false; if(T1->val==T2->val) { if(judge(T1,T2)) return true; } if(isSubtree(T1->right,T2)) return true; if(isSubtree(T1->left,T2)) return true; return false; }};
4、感想
一开始觉得挺简单的,也没打算再写个判断的函数调用,就直接在 isSubtree里面写的,但是后来发现初始时为了找相同节点时可以用if(T1!=NULL&&T2==NULL) return true ;但是在后来找到相同节点值再进行递归判断子树是否相同时这一句就不适用了就会出错。最后还是在外面写了判断的函数。。。
0 0
- lintcode——子树
- LintCode 子树
- lintcode-子树
- lintcode ----子树
- lintcode,子树
- LintCode 子树
- 子树-LintCode
- LintCode-子树
- Lintcode 子树
- lintcode子树
- LintCode 子树
- LintCode 子树
- 子树-LintCode
- 子树(LintCode)
- lintcode subtree 子树
- [LintCode]245.子树
- LintCode-剑指Offer-(245)子树
- lintcode-递归-简单-245子树
- python 中文乱码问题
- python批量下载图片的三种方法
- HTML5基础(三)零基础入门 备份
- JMeter专题系列(二)录制脚本
- JMeter专题系列(三)元件的作用域与执行顺序
- lintcode——子树
- JMeter专题系列(四)参数化
- 采用CreateThread()创建多线程程序 MFC
- Json数据
- JMeter专题系列(五)检查点
- JMeter专题系列(六)集合点
- TimeUnit的用法
- JMeter专题系列(七)聚合报告之 90% Line
- HttpClient在HTTP协议接口测试中的使用