剑指offer 25. 树的子结构

✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:剑指offer系列题解
📝原题地址:题目地址
📣专栏定位:为找工作的小伙伴整理常考算法题解,祝大家都能成功上岸!
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

题目描述

输入两棵二叉树 A,B,判断 B 是不是 A 的子结构。

我们规定空树不是任何树的子结构。

数据范围

每棵树的节点数量 [0,1000]。

样例

树 A:

		 8
		/ \
	   8   7
      / \
     9   2
    / \
   4   7

树 B:

   8
  / \
 9   2

返回 true,因为 B 是 A 的子结构。

方法一:二叉树,递归 O(nm)

这道题分成两个部分:

  1. 遍历 A 树所有结点。
  2. 遍历时,将 A 的结点下的子树和 B 树递归进行比较。

我们拿题目的样例举例:

第一步: 从根结点开始,发现当前结点下的子树并不与 B 树匹配。

在这里插入图片描述

第二步: 递归到根结点的左子树,再判断该结点下的子树是否与 B 树匹配,发现包含 B 树,直接返回 true 即可。

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    //遍历结点
    bool hasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
        if (!pRoot1 || !pRoot2)    return false;
        //判断p1下的子树是否包含p2下的树
        if (isSame(pRoot1, pRoot2))   return true;
        //如果p1当前结点没有和p2匹配成功,再分别去p1的左右结点下的子树进行匹配
        return hasSubtree(pRoot1->left, pRoot2) || hasSubtree(pRoot1->right, pRoot2);
    }
    //比较子树
    bool isSame(TreeNode* pRoot1, TreeNode* pRoot2) {
        if (!pRoot2) return true;	//p2要比p1树小,所以可以以p2为结束标志
        //p1要包含p2,所以p1不能提前为空,否则无法与p2继续匹配
        if (!pRoot1 || pRoot1->val != pRoot2->val)   return false;
        //分别继续比较p1和p2的左子树及右子树是否匹配
        return isSame(pRoot1->left, pRoot2->left) && isSame(pRoot1->right, pRoot2->right);
    }
};

欢迎大家在评论区交流~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值