其他分享
首页 > 其他分享> > 剑指offer:树的子结构

剑指offer:树的子结构

作者:互联网

文章目录

分析

在这里插入图片描述

从主树A的根开始,依次判断B是否是A的子结构。
可以分三种情况:

具体匹配为函数isPart(r1,r2)

ac代码

/**
 * 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) {
        // 其中只要有一个是空的就返回false
        if (!pRoot1 || !pRoot2) return false;
        // root1和root2匹配。
        if (isPart(pRoot1, pRoot2)) return true;
        // 分别递归左右子树left和root2匹配或者right和root2匹配
        return hasSubtree(pRoot1->left, pRoot2) || hasSubtree(pRoot1->right, pRoot2);
    }
    bool isPart(TreeNode *p1, TreeNode *p2) {
        // 第二个根是空的,代表该分支是匹配的。
        if (!p2) return true;
        // 第一个是空的,代表不匹配
        if (!p1) return false;
        // 如果都不空,两个值不同,代表不匹配
        if (p1->val != p2->val) return false;
        // 左边对左边,右边对右边分别判断是否匹配
        return isPart(p1->left, p2->left) && isPart(p1->right, p2->right);
    }
};

时间复杂度: O ( m n ) O(mn) O(mn),m为第一棵树的结点数,n为第二棵树的结点数

题目来源

https://www.acwing.com/problem/content/35/

标签:right,TreeNode,offer,子结构,return,匹配,root2,left
来源: https://blog.csdn.net/shizheng_Li/article/details/122221383