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

2019-11-15  本文已影响0人  Coding破耳

题目描述
输入两棵二叉树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;
    }
};

上一篇 下一篇

猜你喜欢

热点阅读