剑指offer-18.树的子结构

0 题目

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

1 分析

首先,遍历A的节点,找到与B的根节点值相同的节点。然后取判断以这两个节点开头的树,是否相等。

判断两个子树相等的条件也是一个递归。

知道t1为空的时候,就算是判断完了,此时返回true

bool HasSubtree(TreeNode *t1, TreeNode *t2)
{
    bool ret = false;
    if (t1 != nullptr && t2 != nullptr)
    {
        // 如果值相同就去判断是否是子树
        if (t1->val == t2->val)
        {
            ret = aux(t1, t2);
        }

        // 下面两个 只有在ret ==false 的时候才再去遍历
        // 因为ret ==true 的时候是已经找到了子树,因此就需要在去便利了
        if (ret == false)
        {// 左右依次遍历,都是在 ret==false的时候
            ret = HasSubtree(t1->left, t2);
        }
        if (ret == false)
        {
            ret = HasSubtree(t1->right, t2);
        }
    }
    return ret;
}

bool aux(TreeNode *t1, TreeNode *t2)
{
    // t2为nullptr的时候,表示t2完全在t1内
    if (t2 == nullptr)
    {
        return true;
    }
    if (t1 == nullptr)
    {
        return false;
    }
    if (t1->val != t2->val)
    {
        return false;
    }
    return aux(t1->right, t2->right) && aux(t1->left, t2->left);
}

  

原文地址:https://www.cnblogs.com/perfy576/p/8607267.html