剑指offer 25. 树的子结构

简介: 剑指offer 25. 树的子结构

题目描述

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

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


数据范围

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

样例

树 A:

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


树 B:

8
  / \
 9   2
• 1
• 2
• 3

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

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


这道题分成两个部分:

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

我们拿题目的样例举例:

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

7c3c586372ff478983aa85aa78edd11a.png

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

d26ad9f44a6c433892cd563607e1c3cc.png

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

欢迎大家在评论区交流~

目录
相关文章
【剑指offer】-树的子结构-17/67
【剑指offer】-树的子结构-17/67
|
5月前
牛客网-树的子结构
牛客网-树的子结构
19 0
|
5月前
|
算法 程序员 测试技术
【数据结构-二叉树 九】【树的子结构】:树的子结构
【数据结构-二叉树 九】【树的子结构】:树的子结构
45 0
|
11月前
剑指offer_二叉树---树的子结构
剑指offer_二叉树---树的子结构
41 0
|
算法 前端开发 程序员
|
算法
【刷算法】一棵树是否是另一棵树的子结构
【刷算法】一棵树是否是另一棵树的子结构
|
存储 算法
树与图的存储算法模板
树与图的存储算法模板
59 0
|
算法 前端开发 程序员
「LeetCode」剑指Offer-26树的子结构⚡️
「LeetCode」剑指Offer-26树的子结构⚡️
89 0
「LeetCode」剑指Offer-26树的子结构⚡️
|
算法 前端开发 程序员
「LeetCode」572-另一颗树的子树⚡️
「LeetCode」572-另一颗树的子树⚡️
140 0
「LeetCode」572-另一颗树的子树⚡️