c语言-数据结构-二叉树OJ

二叉树OJ


前言

本篇讲解二叉树的OJ题目


一、单值二叉树

题目链接:https://leetcode.cn/problems/univalued-binary-tree/description/

本题要求判断一棵二叉树是否为单值二叉树,即所有节点的值都相同树

可以用遍历解决,但比较麻烦,另一种方法则还是分冶法

分冶法类似于遍历但是不同于遍历

代码实现:

如图,递归展开图为:

红色代表进入函数开始执行,黄色代表函数执行完毕返回

二、二叉树的最大深度

题目链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree/description/

本题类似于之前讲解过的求二叉树的最大高度/深度的功能实现,因此我们直接沿顺思路即可,此处不做过多讲解

代码实现:

三、翻转二叉树

题目链接:https://leetcode.cn/problems/invert-binary-tree/description/

代码实现:

本题常规思路解决即可,定义一个空指针去存储left,交换left与right指针

四、相同的树

题目链接:https://leetcode.cn/problems/same-tree/description/

本题要求判断两棵二叉树是否相同,此处的相同要求结构与对应节点的值均相同

如图:

这种结构可以说是对称,但结构不相同,因此不能说是为相同二叉树

所以本题分为四种情况:

第一种:p树为空,q树也为空,此时两棵树相同,返回true

第二种:p树不为空,q树为空,此时两棵树不相同,返回false

第三种:p树为空,q树不为空,此时两棵树不相同,返回false

第四种:p树不为空,q树也不为空,此时判断两棵树是否相同就要判断对应节点的值是否相同了,此处我们采用的条件是:如果不相同就返回false,相同就继续执行

如果我们采用相同返回true作为判断返回条件,那么我们只要中间有一个节点对应值相等了,就会直接返回,不会再考虑后续节点的值是否相同,因此不能将其作为返回条件

例如:

如果我们采取相同返回true的条件,那么判断完第一个节点相同之后就会直接返回true,函数就结束了,不会继续往下判断

但事实上这两棵树是不相同的,因此不用这种条件作为返回的判断条件

我们采用不同返回false的条件,判断完第一个节点之后进入左子树继续判断,当到达左边节点为2的值时,发现与节点为1的值不同,返回false,之后返回的布尔值中必定为false

此时判断两棵树不相同,正确

代码实现:

五、二叉树的前序遍历

题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/description/

代码实现:

此处我们想要返回它的前序遍历,那就要定义一个容量为二叉树节点个数的数组或指针,但是题目只给了一个returnSize指针以及树的根节点指针root,我们无法直接得到树的总节点个数,因此我们需要自己求,定义一个TreeSize函数去求,求出节点总个数之后赋值给*returnSize

之后定义一个指针a,用于存储树的前序遍历,开辟大小为*returnSize的空间

而我们进行前序遍历存储数据到a中与定义指针a和变量i开辟空间是分开的,是在不同函数中的

因为我们如果想直接在preorderTraversal函数中进行前序遍历的话,那么我们就要在preorderTraversal函数中进行递归,但是该函数的传参形式注定无法实现,因为太过于麻烦

因此我们将它分出一个preOrder函数,一个用于开辟空间,一个用于前序遍历

此时我们定义一个变量i,用于a指针索引的遍历,我们传变量i的时候传递的是i的地址,因为我们要改变的是i的值,如果传递i,那么形参的改变不改变实参,也就是说每次存储数据的时候i的值都是0,一直在覆盖,因此我们要传递i的地址

相关推荐
xiangyun612 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun612 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
OKkankan3 小时前
LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器
数据结构·python·langchain·ai应用
蓝速科技3 小时前
便民服务大厅 AI 数字人一体机场景适配与落地指南丨蓝速科技
大数据·网络·数据结构·人工智能·自然语言处理·数据分析·运维开发
白远山4 小时前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析
xxwxx__4 小时前
C++ AVL 树深度剖析:平衡二叉搜索树原理、源码与面试考点
数据结构·c++
Logic1014 小时前
C语言/数据结构数组题解:数字列表加一(Plus One)——进位处理与数组扩展
c语言·数据结构·模拟·数组·时间复杂度·算法题·进位
Escalating_xu4 小时前
【C语言常见概念】从第一行代码到字符串结束标志:一次打通编译、main、ASCII、转义字符与注释
c语言·c++
DevRay4 小时前
Java 21虚拟线程深度实战:告别线程池焦虑,百万并发吞吐量直接翻倍(原理+代码+避坑)
java·开发语言
Navigator_Z4 小时前
LeetCode //C - 1250. Check If It Is a Good Array
c语言·算法·leetcode