问题描述:有两个不同大小的二进制树: T1
有上百万的节点; T2
有好几百的节点。请设计一种算法,判定 T2
是否为 T1
的子树。
样例
下面的例子中 T2 是 T1 的子树:
1 3
/ \ /
T1 = 2 3 T2 = 4
/
4
下面的例子中 T2 不是 T1 的子树:
1 3
/ \ \
T1 = 2 3 T2 = 4
/
4
实验代码:
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 flag=0;
if(T2==NULL)
return 1;
if(T1==NULL)
return 0;
flag=xiangtong(T1,T2);
if(flag==0)
flag=isSubtree(T1->left,T2);
if(flag==0)
flag=isSubtree(T1->right,T2);
return flag;
}
bool xiangtong(TreeNode *a, TreeNode *b)
{
if(a==NULL&&b==NULL)
return 1;
if(a==NULL&&b!=NULL)
return 0;
if(a!=NULL&&b==NULL)
return 0;
if(a->val==b->val)
{
return xiangtong(a->left,b->left) && xiangtong(a->right,b->right);
}
return 0;
}
};
个人感想:判断两种子树是否的等价时不能忘记一种为空另一种不为空的情况,函数返回值时必须加判断前一个flag是否为0,如果存在1则符合条件,不进行下一步递归直接返回1。