关于树(一般为二叉树),有两个不成文的结论:
- (1)时间复杂度一般含有 logN ;
- (2)执行的方式一般为递归,因为树的左子树、右子树仍然是一棵完整的树;
回到这个题目本身,要查找树 A 中是否存在和树 B 结构一样的子树,我们可以分为两步:
- 1、在树 A 中找到和 B 的根节点的值一样的节点 R
- 2 、再判断 A 中以 R 为根节点的子树是不是包含和树 B 一样的结构;
bool IsSubtree(BinaryTreeNode* root1, BinaryTreeNode* root2)
{
bool flag = false;
if (!root1 && !root2)
{
if (root1->val == root2->val)
flag = DoesTree1HaveTree2(root1, root2);
if (!flag)
flag = IsSubtree(root1->lft, root2);
if (!flag)
flag = IsSubtree(root1->rgt, roo2);
}
return flag;
}
bool DoesTree1HasTree2(BinaryTreeNode* root1, BinaryTreeNode* root2)
{
if (!root2)
return true;
// 突然胜利法
if (!root1)
return false;
if (root1->val != root2->val)
return false;
// 突然死亡法
return DoesTree1HasTree2(root1->lft, roo2->lft) && DoesTree1HasTree2(root1->rgt, root2->rgt);
}
递归有一种抽丝剥茧,层层深入的感觉,就像俄罗斯套娃,“想不想知道我这件衣服下面穿着什么”?