1 题目

输入两颗二叉树A和B,判断B是不是A的子结构(B树是A树的子结构)
比如:
                  2
    树A    3    5      树B   5
            1  4  2  3         2   3
很明显树B是树A的子结构

2 代码实现

#include <stdio.h>#define true 1
#define false 0typedef struct Node
{int value;struct Node* left;struct Node* right;
} Node;int has_sub_tree(Node *head1, Node *head2)
{int result = false;if (head1 != NULL && head2 != NULL){printf("head1->value is %d\n", head1->value);printf("head2->value is %d\n", head2->value);if (head1->value == head2->value){result = is_same(head1, head2); }if (!result){result = has_sub_tree(head1->left, head2);}if (!result){result = has_sub_tree(head1->right, head2);}}return result;
}int is_same(Node *head1, Node *head2)
{if (head2 == NULL){return true;}if (head1 == NULL){return false;}printf("is_same head1->value is %d\n", head1->value);printf("is_same head2->value is %d\n", head2->value);if (head1->value != head2->value){return false;}return is_same(head1->left, head2->left) && is_same(head1->right, head2->right);
}void printf_tree(Node *head)
{if (head != NULL){printf("val is: %d\n", head->value);printf_tree(head->left);printf_tree(head->right);}
}int main()
{/*              2*           3    5            5*         1  4  2  3        2   3*       */Node head1, node1, node2, node3, node4, node5, node6;Node head2, node7, node8;head1.value = 2;node1.value = 3;node2.value = 5;node3.value = 1;node4.value = 4;node5.value = 2;node6.value = 3;head1.left = &node1;head1.right = &node2;node1.left = &node3;node1.right = &node4;node2.left = &node5;node2.right = &node6;node3.left = NULL;node3.right = NULL;node4.left = NULL;node4.right = NULL;node5.left = NULL;node5.right = NULL;node6.left = NULL;node6.right = NULL;head2.value = 5;node7.value = 2;node8.value = 3;head2.left = &node7;head2.right = &node8;node7.left = NULL;node7.right = NULL;node8.left = NULL;node8.right = NULL;printf_tree(&head1);printf_tree(&head2);int result = has_sub_tree(&head1, &head2);printf("result is %d\n", result);return 0;
}

3 运行结果

val is: 2
val is: 3
val is: 1
val is: 4
val is: 5
val is: 2
val is: 3
val is: 5
val is: 2
val is: 3
head1->value is 2
head2->value is 5
head1->value is 3
head2->value is 5
head1->value is 1
head2->value is 5
head1->value is 4
head2->value is 5
head1->value is 5
head2->value is 5
is_same head1->value is 5
is_same head2->value is 5
is_same head1->value is 2
is_same head2->value is 2
is_same head1->value is 3
is_same head2->value is 3
result is 1

4 总结

一开始is_same写错了,实现如下

int is_same(Node *head1, Node *head2)
{if (head1 == NULL){return false;}if (head2 == NULL){return true;}printf("is_same head1->value is %d\n", head1->value);printf("is_same head2->value is %d\n", head2->value);if (head1->value != head2->value){return false;}return is_same(head1->left, head2->left) && is_same(head1->right, head2->right);
}

这样写导致的错误就是,比如
                 2
    树A    3    5      树B   5
            1  4  2  3        2   3
树B的5节点和树A的5节点进行匹配,然后树B的2节点和树A的2节点进行匹配,接下来,树A的left是NULL了,直接返回false,那么后面的  && is_same(head1->right, head2->right)
就不会再执行了,所以返回false,然而B数的右结构没有进行比较是直接false了,所以我们需要把

if (head2 == NULL)
{return true;
}

写在前面,确保比较B树的右节点也会进行比较

剑指offer之树的子结构相关推荐

  1. 左神算法:判断 t1 树是否包含t2 树全部的拓扑结构(剑指 Offer 26. 树的子结构,Java版)

    本题来自左神<程序员代码面试指南>"判断 t1 树是否包含t2 树全部的拓扑结构"题目. 题目 剑指 Offer 26. 树的子结构 给定彼此独立的两棵树头节点分别为 ...

  2. 【LeetCode】剑指 Offer 26. 树的子结构

    [LeetCode]剑指 Offer 26. 树的子结构 文章目录 [LeetCode]剑指 Offer 26. 树的子结构 package offer;//定义树节点 class TreeNode{ ...

  3. 剑指offer:树的子结构

    题目 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 暴力做法 取出树A/B的前序.中序: 判断这两个数组是否A都包含B,是则true. 前序和中 ...

  4. 《剑指offer》-- 树的子结构、二叉树的镜像、二叉树的深度、平衡二叉树

    一. 树的子结构: 1.题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构. 2.解题思路: 这个题比较简单,利用递归的方式就可以判断B是不是A树的子结构 ...

  5. 【无取巧解法,易于理解!】剑指 Offer 26. 树的子结构

    看题解时,很多大牛用很少的代码就完成了AC,但可能看了很多遍也看不懂,因此萌生了写一种最"笨"最完整的代码的想法,这样大家可以通过我的代码入门,看懂了再去挑战大牛们的简洁解法. 输 ...

  6. 剑指offer——判断树的子结构

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

  7. 剑指offer——26.树的子结构(不太熟)

    题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 知识点: 无 注意: 注意想法的递归实现(好好琢磨一下,不然可能会忘!) 代码实现: 具体实现分两步 ...

  8. LeetCode——剑指 Offer 26. 树的子结构

    一.题目 输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 例如: 给定的树 A: 3/ \4 5/ \1 2 ...

  9. 剑指offer 26 树的子结构

    输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 例如: 给定的树 A: 3 / \ 4 5 / 1 2 给定 ...

最新文章

  1. 简单动画函数封装及缓动效果
  2. 小程序开发语言python_小程序是用什么语言开发的?5种最佳语言分享
  3. Linux中软件安装使用的命令是,Linux软件安装命令
  4. ecshop pages.lbi.php,关于Ecshop pages.lbi.php Xss漏洞的修复
  5. python mysql 基于 sqlalvhrmy_Python基于DB-API操作MySQL数据库过程解析
  6. Unity3D的50个技巧:Unity3D最佳实践
  7. ORACLE RAC运行在300G内存以上需要考虑的东西
  8. 大数据学情分析_大数据时代|如何轻松做好学情分析
  9. 操作系统课设 Nachos 实验六、七、八:Nachos 用户程序与系统调用、地址空间的扩展、系统调用 Exec() 与 Exit()
  10. 怎样用Python识别条形码?
  11. VSCode中使用GitHub
  12. GDAL(Geospatial Data Abstraction Library )简介
  13. python dataframe isin,使用多个条件获取新的数据帧pd.Dataframe.isin()
  14. 大数据系列(一)之hadoop介绍及集群搭建
  15. 常用的UML建模详解
  16. 录屏储存失败因为5823_屏幕录制存储失败因为5823
  17. 测试人员在软件开发过程中的任务是什么?
  18. nvm介绍、nvm下载、安装与使用
  19. 易买优购社区分享 -- 创业无处不在.
  20. Swift Invalid bitcode version (Producer: '802.0.41.0_0' Reader: '800.0.42.1_0')

热门文章

  1. .NET 6 Talk Party 2|.NET Core 与行业
  2. Visual Studio 2022 预览版2 发布啦
  3. 使用微信云托管快速部署一个.Net Core项目(一)
  4. NET问答: 枚举 和 常量 在使用时该怎么抉择?
  5. .NET6又出新版本,新增这几个大杀器!
  6. OrchardCore 如何动态加载模块?
  7. 解决 .NET Core 在 Linux Container 中获取 CurrentCulture 不正确的问题
  8. AOP(面向切面编程)大概了解一下
  9. 记一次CPU持续100%及分析方法
  10. 大会线上同步直播, 来不到现场也可以线上看直播,以及参会秘籍