[剑指offer] 树的子结构

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

建立一个函数isSubtreeWithSameRoot(TreeNode* pRoot1, TreeNode* pRoot2)判断第二个是不是第一个的子结构且是从根节点开始匹配相同的。

然后在HasSubtree中前序遍历判断是否isSubtreeWithSameRoot。

需要注意的是,子结构不需要是某个“叶结构”,只要是树的一个部分就是它的子结构。

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct 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;
        if (isSubtreeWithSameRoot(pRoot1, pRoot2)) return true;
        if (HasSubtree(pRoot1->left, pRoot2)) return true;
        if (HasSubtree(pRoot1->right, pRoot2)) return true;
        return false;
    }
    bool isSubtreeWithSameRoot(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if (!pRoot1 && pRoot2) return false;
        if (!pRoot2) return true;
        if (pRoot1->val != pRoot2->val) return false;
        return isSubtreeWithSameRoot(pRoot1->left, pRoot2->left)
            && isSubtreeWithSameRoot(pRoot1->right, pRoot2->right);
    }
};
原文地址:https://www.cnblogs.com/zmj97/p/7905181.html