美文网首页
[剑指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]树的子结构

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

  • [剑指offer] 树的子结构

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

  • 【剑指26】树的子结构

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

  • 【剑指 offer】树的子结构。

    1、题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。 我们规定空树不是任何树的子结构。 样例树A8/ \...

  • 剑指offer——树的子结构

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

  • 剑指offer - 树的子结构

    题目 输入两棵二叉树A和B,判断B是不是A的子结构。二叉树节点的定义如下: 下图中的二棵二叉树,由于A中有一部分子...

  • [剑指Offer]树的子结构

    本文首发于我的个人博客Suixin’s Blog原文: https://suixinblog.cn/2019/03...

  • 2022-04-30

    剑指 Offer 26. 树的子结构[https://leetcode.cn/problems/shu-de-zi...

  • 【剑指Offer】017——树的子结构(树)

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

  • 剑指offer----树的子结构

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

网友评论

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

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