美文网首页
[剑指offer-26]树的子结构

[剑指offer-26]树的子结构

作者: Coding破耳 | 来源:发表于2019-11-15 22:22 被阅读0次

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

    解法

    首先,约定空树不是任意数的子结构,因此若B为空,则b不是a的子结构,不论a是否为空;
    当b不为空时,若a为空,则b不是a的子结构。
    当ab均不为空时,判断b是否为a的子结构步骤如下:
    若a的根结点的值与b的根节点的值相等,判断b是否在a的结构中(方法IsBinA),若在则b为a的子结构;若不在,递归判断b是不是a的左树/右树的子结构。
    写出伪代码如下:

    bool IsBinA(a,b)
    {
        if(b 为空)
        {
            返回true;
        }
        if(a 为空)
        {
            返回false;
        }
         
        if(a的值与b的值相等)
        {
            return IsBinA(a->left,b->left) && IsBinA(a->right,b->right); 
        }
    
        return false;
    }
    bool HasSubtree(a,b)
    {
        if(a 为空 || b 为空)
        {
            返回false;
        }
    
        //ab均不为空
        bool result = false;
        if(a的值与b的值相等)
        {
            判断b是不是a的子结构
            result = IsBinA(a,b);
        }
        //b不是a的子结构
        if(!result)
        {
            result = HasSubtree(a->left,b) || HasSubtree(a->right,b);
        }
        return result;
    }
    

    方法IsBinA,判断B是不是A的子结构:
    1.若b为空,不论a是否为空,说明b是a的子结构,返回true
    2.若a为空,因上面已经判断b为空的场景,故此时a为空时b不是a的子结构,返回false
    3.若ab均不为空,且ab的根结点值相同,对ab的左右节点分别进行IsBinA判断

    代码实现如下:

    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };*/
    class Solution {
    public:
        bool DoseSubTree(TreeNode* pRoot1, TreeNode* pRoot2)
        {
            if(pRoot2 == NULL)
            {
                return true;
            }
            
            if(pRoot1 == NULL)
            {
                return false;
            }
            
            if(pRoot1->val == pRoot2->val
               && DoseSubTree(pRoot1->left,pRoot2->left) 
               && DoseSubTree(pRoot1->right,pRoot2->right))
            {
                return true;
            }
            
            return false;
        }
        bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
        {
            if(pRoot1 == NULL || pRoot2 == NULL)
            {
                return false;
            }
            
            bool result = false;
            if(!(pRoot1->val == pRoot2->val && DoseSubTree(pRoot1,pRoot2)))
            {
                return HasSubtree(pRoot1->left,pRoot2) || HasSubtree(pRoot1->right,pRoot2);
            }
            
            return true;
        }
    };
    
    

    相关文章

      网友评论

          本文标题:[剑指offer-26]树的子结构

          本文链接:https://www.haomeiwen.com/subject/vvskyctx.html