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