day21:37. 树的子结构(递归)and leetcode 100 相同的树 and leetcode 572另一棵树的子树

leetcode 100 相同的树
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:
输入:p = [1,2,3], q = [1,2,3]
输出:true
示例 2:
输入:p = [1,2], q = [1,null,2]
输出:false
示例 3:
输入:p = [1,2,1], q = [1,1,2]
输出:false

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if(!p && !q) return true;
        if(!p || !q) return false;
        if(p->val != q->val ) return false;
        return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
    }
};

问题描述:
输入两棵二叉树A,B,判断B是不是A的子结构。我们规定空树不是任何树的子结构。
样例
在这里插入图片描述
使用递归,题目已知空树不是任何树的子结构,所以如果两个树其中一棵为空,那么返回false。需要两步判断
1)先序判断pRoot1中的根节点是否满足,如果不包含则遍历pRoot1的左子树和右子树。
2)如何判断是否满足就需要进一步判断,如果P2这一个根节点为空,那么判断完毕返回true,如果P1这一个根节点为空,或者 P1对应的值与P2对应的值不相等那么返回false。这些条件都不满足,那么需要判断该节点对应的左右两部分是否相同。
需要两步递归,原因在于,第一个递归是用来寻找根节点的切入点,找到根节点之后,才可以进行下一步的比较工作;找到根节点之后就需要在pRoot1对应的子树与pRoot2进行比较。

class Solution {
public:
    bool hasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
        if(!pRoot1 || !pRoot2) return false;
        if(isPart(pRoot1,pRoot2)) return true;
        return hasSubtree(pRoot1->left,pRoot2) || hasSubtree(pRoot1->right,pRoot2);
    }
    bool isPart(TreeNode* p1,TreeNode* p2)
    {
        if(!p2) return true;
        if(!p1||p1->val!=p2->val) return false;
        return isPart(p1->left,p2->left) && isPart(p1->right,p2->right);
    }
};

链接总结了对称性递归的许多题目。
题型分类:
可以用对称性递归解决的二叉树问题大多是判断性问题(bool类型函数),这一类问题又可以分为以下两类:
1、不需要构造辅助函数。这一类题目有两种情况:第一种是单树问题,且不需要用到子树的某一部分(比如根节点左子树的右子树),只要利用根节点左右子树的对称性即可进行递归。第二种是双树问题,即本身题目要求比较两棵树,那么不需要构造新函数。该类型题目如下:
100. 相同的树
226. 翻转二叉树
104. 二叉树的最大深度
110. 平衡二叉树
543. 二叉树的直径
617. 合并二叉树
572. 另一个树的子树
965. 单值二叉树
2、需要构造辅助函数。这类题目通常只用根节点子树对称性无法完全解决问题,必须要用到子树的某一部分进行递归,即要调用辅助函数比较两个部分子树。形式上主函数参数列表只有一个根节点,辅助函数参数列表有两个节点。该类型题目如下:
101. 对称二叉树
剑指 Offer 26. 树的子结构

作者:eh-xing-qing
链接:https://leetcode-cn.com/problems/subtree-of-another-tree/solution/yi-pian-wen-zhang-dai-ni-chi-tou-dui-che-sd29/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值