树的子结构

来源:互联网 发布:淘宝该怎么做 编辑:程序博客网 时间:2024/05/23 18:33

题目

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

思路

这里说的是子结构不是子树,子结构只要满足符合树里面的部分结构就可以了,子树的话,就需要从子树的根节点开始到根节点全部一样了。所以判断子结构需要从子结构的根开始一个一个的判断,然后还要注意有可能子结构下面的节点就空了,但是原树下面是还有子节点的情况,这也是符合要求的。
假设原树是pRoot1, 匹配的子结构是pRoot2;
由于空树不是任何一个树的子结构,所以如果pRoot1和pRoot2有一个为空就返回false;
如果当前原树的根节点和匹配的子结构的根节点值一样,那么可以递归判断两者的左右子树(如果子结构的子树为空也返回true);
递归用根节点的左右子树来和子结构的根节点判断;

参考代码

/*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;        return ((pRoot1->val == pRoot2->val) && check(pRoot1->left, pRoot2->left) && check(pRoot1->right, pRoot2->right))            || HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2);    }private:    bool check(TreeNode* p, TreeNode* t) {        if (!t) return true;        if (!p)return false;        return (p->val == t->val) && (check(p->left, t->left) && check(p->right, t->right));    }};