【二叉树练习题】

在这里插入图片描述

欢迎来到我的:世界

希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 !


目录

  • 前言
  • 初阶题
    • 二叉树的节点个数
    • 二叉树的叶子节点个数
    • 二叉树第k层节点个数
    • 二叉树查找值为x的节点
  • 进阶题
    • 完全二叉树的节点个数
    • 翻转二叉树
    • 检验两个树是否相同
    • 对称二叉树
    • 检验是否是其子树
  • 总结

前言

本篇文章共有9道题,其中4题是初阶,5题是进阶题;希望该文章对你有帮助!


初阶题

既然了解的二叉树的基本结构,接下来了解几个有关二叉树的基本函数吧!

二叉树的节点个数


如果知道一颗二叉树,那怎么求这颗二叉树的节点个数呢?

思路: 我们可以利用树的递归的思想,遍历这颗树,这里我们用前序遍历:如果遇到节点就再向左右子树深层递归下去+1(其本身),直到遇到空就返回0;
下面根据图解的方式:
在这里插入图片描述

代码实现:

//二叉树的节点个数
int BinaryTreeSize(BTNode* root)
{return root == NULL ? 0 : BinaryTreeSize(root->left) + BinaryTreeSize(root->right) + 1;
}

二叉树的叶子节点个数

知道二叉树的节点个数,那叶子结点个数呢?
叶子节点是和普通的节点不一样的,叶子结点其特点是:没有子节点的,所以我们可以根据这一特性来解决这个问题;

思路:我们还是可以利用二叉树树的结构特点,前序遍历这颗二叉树树,如果节点的左右节点返回=0,那就说明该节点是叶子结点,那就返回1,否则就返回左右子树的值;
在这里插入图片描述

代码实现:

//求叶子节点的个数
int BinaryTreeLeafSize(BTNode* root)
{if (root == NULL)return 0;int left = BinaryTreeLeafSize(root->left);int right = BinaryTreeLeafSize(root->right);return left + right == 0 ? 1 : (left + right);
}

注意:关于这代码实现,可能有老铁想过可以这样写代码是不是方便点:
代码:错误的示例

//求叶子节点的个数
int BinaryTreeLeafSize(BTNode* root)
{if (root == NULL)return 0;return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right) == 0  ? 1 : (BinaryTreeLeafSize(root->left) +  BinaryTreeLeafSize(root->right));
}

这样想的话就是理解的不够深刻,你要知道每次递归调用这个函数,调用的栈空间就越大,栈的空间不大,调用的越深越容易栈溢出;还有一点,你要知道的是这个节点的左右子树的返回值,如在前面的已经知道该节点的左右子树的返回值和,在往后走就会再一次往深层遍历一次了,这完全是没有必要,多此一举;

二叉树第k层节点个数

下面来加一点点难度吧!

思路:就是关键的k的值,在每次递归调用的时候 k-1,就可以实现了,不过还要加一条条件:如果当k==1时,就到了要求k层的节点个数的那层,这时只要不为空,则都返回 1,记住:这是求第k层的节点个数;
在这里插入图片描述

代码实现:

//二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{assert(k > 0);if (root == NULL)return 0;if (k == 1 )return 1;return BinaryTreeLevelKSize(root->left, k-1) + BinaryTreeLevelKSize(root->right, k-1);
}

二叉树查找值为x的节点

思路:二叉树最常利用的递归的思想,往下遍历一遍,找到了一样的值,就返回该值的结点,否则就返回NULL;
代码实现:

//二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;if (root->val == x)return root;BTNode* left = BinaryTreeFind(root->left, x);if (left)return left;BTNode* right = BinaryTreeFind(root->right, x);if (right)return right;
}

有一个改善版本:

//二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;if (root->val == x)return root;BTNode*left=BinaryTreeFind(root->left,x);if (left)return left;return BinaryTreeFind(root->right,x);
}

进阶题

完全二叉树的节点个数


地址:oj地址


在这里插入图片描述

解题思路:

这道题仔细一看是不是和我们上面初阶那道:求二叉树的节点个数一样,那这题是完全二叉树的结点个数,那不是肯定能行么?那我们先试一试能不能过;
答案是: 过了;在这里插入图片描述

代码实现:

//完全二叉树的节点个数
int countNodes(struct TreeNode* root){
return root == NULL ? 0 : countNodes(root->left) + countNodes(root->right) + 1;
}

翻转二叉树


地址:oj地址


在这里插入图片描述

解题思路:
可以看出,交换节点的左右子树即可;需要注意的是:返回的是节点本身,这要才能连带着其子节点交换过去;
在这里插入图片描述

//翻转二叉树
struct TreeNode* invertTree(struct TreeNode* root){if(root==NULL)return NULL;struct TreeNode*left=invertTree(root->left);struct TreeNode*right=invertTree(root->right);root->left=right;root->right=left;return root;
}

检验两个树是否相同


地址:oj地址


在这里插入图片描述

解题思路:
两颗树完全相同,代表着其所有子节点值都相同,那就同时遍历两颗树,是两颗树的左子树和左子树进行比较,右子树和右子树进行比较,绝不能左子树和右子树进行比较;遍历到底时,如果两树的节点都指向NULL则代表相同就返回true;如果只有其中一个节点指向NULL则代表两个节点不同返回flase,当两个节点指向的都不是NULL,那就比较节点值,不同的则返回flase;最后的判断条件,只要两颗树都返回true,则代表两颗树相同;

代码实现:

bool isSameTree(struct TreeNode* p, struct TreeNode* q){//两个都为空if(p==NULL && q==NULL)return true;//其中一个为空if(p==NULL || q==NULL)return false;if(p->val!=q->val)return false;return isSameTree(p->left,q->left) &&isSameTree(p->right,q->right);
}

对称二叉树


地址:oj地址


在这里插入图片描述

解题思路:
看一颗二叉树是否对称,完全可以以根节点当做是对称轴,然后比较根节点的左子树和右子树是否对称即可;简化为判断两棵树是否对称,这时候上面的一题:相同的树;很像,但不同的是对称,不是相同,所以我们需要变化一下,在相同的树的解题思路上,注意一点:他要比较的是一颗树的左子树和另一颗树的右子树进行比较,所以根据这点:

代码实现:

bool Cheak(struct TreeNode*q,struct TreeNode*p)
{//两个都为空if(p==NULL && q==NULL)return true;//其中一个为空if(p==NULL || q==NULL)return false;if(p->val!=q->val)return false;return Cheak(q->left,p->right) &&Cheak(q->right,p->left);
}bool isSymmetric(struct TreeNode* root){struct TreeNode*left =root->left;struct TreeNode*right=root->right;return Cheak(left,right);
}

检验是否是其子树


地址:oj地址


在这里插入图片描述
在这里插入图片描述

解题思路:
这题我们可以换个思路:找到root树中与subRoot树相同的根节点后,就比较这两颗树是否相同,如果都相同,则代表subRoot树是root树的子树;只要找到相同的树,就不需要再找了;

代码实现:

bool isSameTree(struct TreeNode* p, struct TreeNode* q){//两个都为空if(p==NULL && q==NULL)return true;//其中一个为空if(p==NULL || q==NULL)return false;if(p->val!=q->val)return false;return isSameTree(p->left,q->left) &&isSameTree(p->right,q->right);
}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){if(root==NULL)return false;if(root->val==subRoot->val){if(isSameTree(root,subRoot))return true;}return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

总结


到了最后:感谢支持

我还想告诉你的是:
------------对过程全力以赴,对结果淡然处之
也是对我自己讲的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/150174.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树--二叉树最小深度

文章前言:如果有小白同学还是对于二叉树不太清楚,作者推荐: 二叉树的初步认识_加瓦不加班的博客-CSDN博客 后序遍历求解 public int minDepth(TreeNode node) {if (node null) {return 0;}int d1 minDepth(node.left);int d2 minDepth(n…

Mind Map:大语言模型中的知识图谱提示激发思维图10.1+10.2

知识图谱提示激发思维图 摘要介绍相关工作方法第一步:证据图挖掘第二步:证据图聚合第三步:LLM Mind Map推理 实验实验设置医学问答长对话问题使用KG的部分知识生成深入分析 总结 摘要 LLM通常在吸收新知识的能力、generation of hallucinati…

【BI看板】Superset2.0+图表二次开发初探

Superset图表功能也很丰富了,但一些个性化的定制需求就需要二次开发了。网上二开的superset版本大多是0.xxx版本的或1.5xxx版本,本次用的是2.xxx。 源码相关说明 源码目录 superset-2.0\superset-frontend\plugins\plugin-chart-echarts Yeoman 生成器 …

水库安全监测方案(实时数据采集、高速数据传输)

​ 一、引言 水库的安全监测对于防止水灾和保障人民生命财产安全至关重要。为了提高水库安全监测的效率和准确性,本文将介绍一种使用星创易联DTU200和SG800 5g工业路由器部署的水库安全监测方案。 二、方案概述 本方案主要通过使用星创易联DTU200和SG800 5g工业路…

试题:动态规划

爱吃鬼 小艺酱每天都在吃和睡中浑浑噩噩的度过。 可是小肚子是有空间上限v的。 小艺酱有n包零食,每包零食占据小肚子空间a_i并会给小艺酱一个甜蜜值b_i。 小艺酱想知道自己在小肚子空间上限允许范围内最大能获得的甜蜜值是多少? 使用c和动态规划解题&#xff1a…

Kaggle - LLM Science Exam(一):赛事概述、数据收集、BERT Baseline

文章目录 一、赛事概述1.1 OpenBookQA Dataset1.2 比赛背景1.3 评估方法和代码要求1.4 比赛数据集1.5 优秀notebook 二、BERT Baseline2.1 数据预处理2.2 定义data_collator2.3 加载模型,配置trainer并训练2.4 预测结果并提交2.5 deberta-v3-large 1k Wiki&#xff…

Python 无废话-基础知识元组Tuple详讲

“元组 Tuple”是一个有序、不可变的序列集合,元组的元素可以包含任意类型的数据,如整数、浮点数、字符串等,用()表示,如下示例: 元组特征 1) 元组中的各个元素,可以具有不相同的数据类型,如 T…

十二、Django之模板的继承+用户列表

模板的继承 新建layout.html&#xff1a; {% load static %} <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><link rel"stylesheet" href"{% static plugins…

前端 富文本编辑器原理——从javascript、html、css开始入门

文章目录 ⭐前言⭐html的contenteditable属性&#x1f496; 输入的光标位置&#xff08;浏览器获取selection&#xff09;⭐使用Selection.toString () 返回指定的文本⭐getRangeAt 获取指定索引范围 &#x1f496; 修改光标位置&#x1f496; 设置选取range ⭐总结⭐结束 ⭐前…

一座“城池”:泡泡玛特主题乐园背后,IP梦想照亮现实

“更适合中国宝宝体质”的主题乐园&#xff0c;被泡泡玛特造出来了。 9月26日&#xff0c;位于北京朝阳公园内的国内首个潮玩行业沉浸式 IP 主题乐园&#xff0c;也是泡泡玛特首个线下乐园——泡泡玛特城市乐园 POP LAND正式开园。 约4万平方米的空间中&#xff0c;泡泡玛特使…

第五课 树与图

文章目录 第五课 树与图lc94.二叉树的中序遍历--简单题目描述代码展示 lc589.N叉树的层序遍历--中等题目描述代码展示 lc297.二叉树的序列化和反序列化--困难题目描述代码展示 lc105.从前序与中序遍历序列构造二叉树--中等题目描述代码展示 lc106.从中序与后序遍历序列构造二叉…

我的第一个react.js 的router工程

react.js 开发的时候&#xff0c;都是针对一个页面的&#xff0c;多个页面就要用Router了&#xff0c;本文介绍我在vscode 下的第一个router 工程。 我在学习react.js 前端开发&#xff0c;学到router 路由的时候有点犯难了。经过1-2天的努力&#xff0c;终于完成了第一个工程…

【安鸾靶场】实战渗透

文章目录 前言一、租房网 (150分)二、企业网站 (300分)三、SQL注入进阶 (550分) 前言 最近看到安鸾的靶场有些比较有意思就打了一下午&#xff0c;有一定难度。 一、租房网 (150分) http://106.15.50.112:8031/ 刚打开burp就报了thinkphp的代码执行 直接getshell flag&a…

【Docker】Docker的应用包含Sandbox、PaaS、Open Solution以及IT运维概念的详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

【数据结构】栈的实现

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;数据结构 &#x1f525;该文章主要了解实现栈的相关操作。 目录&#xff1a; &#x1f30d; 栈的概念&#x1f30e;栈的实现✉️ 初始化栈 和…

Linux-centos系统安装MySql5.7

1.配置yum仓库 1.1配置yum仓库 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 1.2 安装Mysql yum库 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm 2.使用yum安装Msql 说明&#xff1a;下载大约5分钟左右 yum -y install mysq…

【赠书活动】Excel透视表的简单应用

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

如何优雅构建自定义 Spring Boot 验证器,让你的代码更加丝滑!

作为一名开发人员&#xff0c;你应该知道确保应用程序中流动的数据的准确性和完整性是多么重要。Spring Boot提供了强大的验证功能&#xff0c;但有时我们需要额外的验证&#xff0c;创建适合特定需求的自定义验证器。 接下来&#xff0c;我们来介绍下如何完整的创建一个自定义…

日期相关工具类

日期相关工具类 【一】介绍【1】SimpleDateFormat 为什么是线程不安全【2】解决 SimpleDateFormat 线程不安全的方法 【二】LocalDate API【三】LocalTime API【四】LocalDateTime API【五】转换关系【1】LocalDateTime 与 LocalDate 之间的转换【2】LocalDateTime 与 Date 之间…

账户和组管理

1. 账户和工作组的分类 1.1. 用户分为三类&#xff1a; 超级账户——账户名为root&#xff0c;它具有一切权限&#xff0c;只有进行系统维护(例如&#xff1a;建立用户等)或其他必要情形下才 用超级用户登录&#xff0c;以避免系统出现安全问题。 系统账户——是Linux系统正常…