lintcode.245 子树

时间:2021-08-24 09:12:38

子树

 

有两个不同大小的二进制树: 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                3
/ \ /
T1 = 2 3 T2 = 4
/
4

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

       1               3
/ \ \
T1 = 2 3 T2 = 4
/
4
很神奇的一道题,有个样例是{9,9,9,9,9,9,9.......},会卡住。
就是说开始判断时,子树为空有的节点,树上也不能有,否则就不是子树了。一开始一直没想明白。 AC代码,
/**
* 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: The roots of binary tree T1.
* @param T2: The roots of binary tree T2.
* @return: True if T2 is a subtree of T1, or false.
*/
bool isSubtree(TreeNode *T1, TreeNode *T2) {
bool result = false;
if (T2 == NULL)
{
return true;
}
if (T1 == NULL)
{
return false;
} if (T1->val == T2->val) {
result = hasSubtree(T1,T2);
}
if (!result) {
result = isSubtree(T1->left,T2);
}
if (!result) {
result = isSubtree(T1->right,T2);
}
return result;
} bool hasSubtree(TreeNode *T1, TreeNode *T2)
{
if(T2==NULL && T1==NULL)
return true; if (T1 != NULL && T2!=NULL && T1->val == T2->val)
{
return hasSubtree(T1->left,T2->left) && hasSubtree(T1->right,T2->right);
}
return false;
}
};

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

代码如下:

/**
* 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 isSubtree(TreeNode *T1, TreeNode *T2) {
// write your code here
bool res= false;
if(T2 == NULL)
return true;
if(T1 == NULL)
return false;
if(T1 -> val == T2 -> val)
res = cmp(T1,T2);
if(!res)
res=isSubtree(T1->left,T2);
if(!res)
res=isSubtree(T1->right,T2);
return res;
}
bool cmp(TreeNode *T1,TreeNode *T2){
if(T2 == NULL && T1 == NULL)
return true;
if(T1 -> val == T2 -> val && T1 != NULL && T2 != NULL)
return cmp(T1->left,T2->left) && cmp(T1->right,T2->right);
return false;
}
};

  

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