1.问题描述:有两个不同大小的二进制树: T1
有上百万的节点; T2
有好几百的节点。请设计一种算法,判定 T2
是否为 T1
的子树。
2.思路:样例
下面的例子中 T2 是 T1 的子树:
1 3
/ \ /
T1 = 2 3 T2 = 4
/
4
下面的例子中 T2 不是 T1 的子树:
1 3
/ \ \
T1 = 2 3 T2 = 4
/
4
先判断T1、T2是否为空,①如果T2是空则它直接是T1的子树,②然而如果T1是空则是不对的。③而如果T1的值等于T2的值,并且它们剩下的节点的值及位置经过遍历也是相同的,则T2就是T1的子树。④还有一种情况就是T1左子树的某个节点值与T2的根节点相同且通过遍历发现后面的值及位置相同则T2是T1的子树⑤T1右子树的某个节点值与T2的根节点相同且通过遍历发现后面的值及位置相同则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 isSubtree(TreeNode *T1, TreeNode *T2)
{ // write your code here
if(!T2)
return true;
if(!T1)
return false;
if(T1->val==T2->val)
{ if(check(T1,T2))
return true;
}
if(isSubtree(T1->left,T2))
return true;
if(isSubtree(T1->right,T2))
return true;
return false;
}
bool check(TreeNode *T1,TreeNode *T2){
if(!T1&&!T2)
return true;
if(!T1||!T2)
return false;
if(T1->val==T2->val){
return check(T1->left,T2->left)&&check(T1->right,T2->right);
}
return false;
}
};
4.感想:这个题目一开始无从下手从网上搜了搜代码才明白,情况也比较多容易漏~