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
先写一个主函数,在其中用递归判断T1中有没有跟T2完全相等的子树,或者T2为空的情况,该情况返回TRUE,若T1为空则返回FALSE,再写一个判断两棵树完全相等的函数,方便在主函数中调用。
3.代码:
bool isSubtree(TreeNode *T1, TreeNode *T2) {
if (T2 == NULL) {
return true;
}
if (T1 == NULL) {
return false;
}
if (isEqual(T1, T2)) {
return true;
}
if (isSubtree(T1->left, T2) || isSubtree(T1->right, T2)) {
return true;
}
return false;
}
bool isEqual(TreeNode *T1, TreeNode *T2) {
if (T1 == NULL || T2 == NULL) {
return T1 == T2;
}
if (T1->val != T2->val) {
return false;
}
return isEqual(T1->left, T2->left) && isEqual(T1->right, T2->right);
}
4.感想:
本想在一个函数中实现判断完全相等与递归到特殊情况的,但是发现很难实现,最后还是参考的别人的改成两个函数一起实现了