【剑指 offer】(十八)—— 树的子结构

来源:互联网 发布:mac office软件破解版 编辑:程序博客网 时间:2024/05/21 17:09

关于树(一般为二叉树),有两个不成文的结论:

  • (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);}

递归有一种抽丝剥茧,层层深入的感觉,就像俄罗斯套娃,“想不想知道我这件衣服下面穿着什么”?

0 0