首页 > 试题广场 >

树的子结构

[编程题]树的子结构
  • 热度指数:944080 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)
假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构

数据范围:
0 <= A的节点个数 <= 10000
0 <= B的节点个数 <= 10000
示例1

输入

{8,8,7,9,2,#,#,#,#,4,7},{8,9,2}

输出

true
示例2

输入

{1,2,3,4,5},{2,4}

输出

true
示例3

输入

{1,2,3},{3,1}

输出

false

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
#include <stdbool.h>
bool compare(struct TreeNode* s1,struct TreeNode* s2)
{
    if(s2==NULL)    return true;
    if(s2 && s1==NULL)    return false;
    if(s1->val==s2->val)
    {
        bool a=compare(s1->left,s2->left);
        bool b=compare(s1->right,s2->right);
        return a&&b;
    }else
    {
        return false;
    }
}
bool HasSubtree(struct TreeNode* pRoot1, struct TreeNode* pRoot2 ) {
    // write code here
    if(pRoot2==NULL)    return false;
    if(pRoot1==NULL)    return false;
    if(compare(pRoot1,pRoot2))
    {
        return true;
    }
    bool a=HasSubtree(pRoot1->left,pRoot2);
    bool b=HasSubtree(pRoot1->right,pRoot2);
    return a||b;
}
发表于 2022-08-13 15:24:16 回复(0)
/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pRoot1 TreeNode类 
 * @param pRoot2 TreeNode类 
 * @return bool布尔型
 */
//如有需要,我再填上注释
#include<stdbool.h>
bool IsSame(struct TreeNode *pRoot1,struct TreeNode  *pRoot2)
{
    if(pRoot2==NULL) return true;
    if(pRoot1==NULL) return false;
    if(pRoot1->val != pRoot2->val) return false;
    return (IsSame(pRoot1->left, pRoot2->left)&&IsSame(pRoot1->right,pRoot2->right));
}
bool HasSubtree(struct TreeNode* pRoot1, struct TreeNode* pRoot2 ) {
    // write code here
    if(pRoot2==NULL||pRoot1==NULL) return false;
    if(IsSame(pRoot1, pRoot2)) return true;
    if(HasSubtree(pRoot1->left,pRoot2)) return true;
    if(HasSubtree(pRoot1->right,pRoot2)) return true;
    return false;
} 

发表于 2022-01-29 19:22:00 回复(0)