力扣经典题目之->二叉树的前序遍历(中序后序同理)

一:题目

解释:

1:

题目的要求就是我们return 一个数组,该数组里面的元素及其顺序就是 前序遍历二叉树 的元素及其顺序

比如:示例1的树,前序遍历的顺序应该是1 2 3,那么return 的数组里面的元素及其顺序就是1 2 3

2:

红框里的 returnSize是一个int * 类型的,是一个被传过来的整形指针,它的作用就是我们要将其赋为数组的元素个数,也就是 *returnSize = 元素个数,因为传过来的是int* ,我们才能真正的改变其本身。

returnSize并不是让我们将其当做一个变量来使用,因为变量我们可以自己创建,并不需要这么麻烦的当做参数传给我们。

3:

因为C语言不支持返回数组和数组的大小两个变量,所以通常会通过一个额外的参数来传递数组的大小。

二:代码

根据前文,可知:

1:我们要得到数组的元素个数

2:我们要把前序遍历的元素及其顺序放进数组中

3:最后返回这个数组,且将returnSize赋成元素的个数

解释:

第一个函数 (int TreeSize(struct TreeNode* root)

1:

int TreeSize(struct TreeNode* root)

  • 这是一个函数定义,名为TreeSize,它接收一个指向二叉树节点的指针root作为参数。
  • 函数返回一个整数,这个整数代表了以root为根的整棵二叉树中的节点数量。

2:

return root==NULL? 0:TreeSize(root->left)+TreeSize(root->right)+1;

  • 这是函数的返回语句,使用了条件运算符(也称为三元运算符)。
  • root==NULL:检查传入的节点是否为空(即检查树是否为空或者是否到达了叶节点的子节点)。
  • 如果rootNULL(意味着当前子树为空),则返回0,因为空树没有节点。
  • 如果root不为NULL,则递归计算左子树和右子树的节点数量,并将它们相加,然后加上当前节点(root),因此是TreeSize(root->left) + TreeSize(root->right) + 1

3:

递归的工作原理如下:

  • 递归的基本情况(停止条件):当递归到叶子节点的子节点时(即遇到NULL),返回0
  • 递归的递推情况:对于非空的树,函数递归地计算左子树和右子树的大小,将这两个值相加,并加上当前节点(root)本身。

递归最终会遍历二叉树中的每一个节点,并将它们全部计数一次。

4:

一种错的书写方式:

原因:表达式能用在三目中,而语句不能。return 0 这是一个语句,而0是一个表达式。

第二个函数(void preorder(struct TreeNode* root,int * arr,int* pi))

代码解释:

  • void preorder(struct TreeNode* root, int * arr, int* pi)

    • 定义了一个名为preorder的函数,它接收三个参数:
      • struct TreeNode* root:当前遍历到的二叉树节点的指针。
      • int * arr:一个整数数组的指针,用于存储遍历的结果。
      • int* pi:一个整数指针,用于跟踪当前应该将节点值放入数组的哪个位置。
  • if(root==NULL) return;

    • 这是递归的基本情况(停止条件)。如果当前节点是NULL(即到达了叶子节点的子节点),则直接返回,不执行任何操作。
  • arr[(*pi)++] = root->val;

    • 将当前节点root的值root->val存储到数组arr的第(*pi)个位置,并将pi指向的索引值自增1。这里的(*pi)++是一个后缀自增运算符,它首先返回*pi的值,然后将*pi的值加1。
  • preorder(root->left, arr, pi);

    • 递归调用preorder函数来遍历当前节点的左子树。
  • preorder(root->right, arr, pi);

    • 递归调用preorder函数来遍历当前节点的右子树。

Q:j是用来控制下标的,那为什么穿的不是j,而是&j?

A:

可知:

在第9步之前pi都是3,但是第9步之后,他回到了上一层函数,这层函数里面的pi是1++之后的2,所以pi被改变了,指向了错误的位置,如果后面还有新的节点要存进数组,3这个值就会被覆盖,而&j就避免了这种错误,不管在哪一层,他的值都是被全局改变了

第三个函数:preorderTraversal

就是结合前两个函数,用第一个函数的返回值得到n,n就能malloc一个刚刚好大小的数组,然后再传给preorder 函数将数组按照前序遍历装满,最后将n给returnSize,最后return arr数组。

关于前中后序遍历不了解的同学:递归实现 前/中/后序 遍历二叉树 的详细讲解-CSDN博客

中序:

后序:

 

 

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

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

相关文章

智慧高校迎新服务平台的设计与实现---附源码92489

摘要 随着高校规模的不断扩大和新生人数的增加,传统的手工登记和管理方式已经无法满足高效、准确的需求。为了提升高校新生报到迎新工作的效率和质量,本研究设计开发了一套基于SSM框架的智慧高校迎新服务平台的设计与实现。系统通过信息技术的应用&#…

12-使用gateway作为微服务网关

本文介绍spring gateway的使用,包括配置文件的使用和调试跟踪,让大家了解spring gateway的基本用法。如果不了解什么是微服务网关,就先查查资料,网关相对来说是比较重要的微服务组件。 0、环境 springboot 2.4.2springcloud gat…

Minkowski分形电路生成工具[程序附后]

此工具用于生成Minkowski分形电路,应用领域可参考分形电路的纪录片或CNKI论文。运行环境在Altium Designer中,可用于Altium Designer全系列的版本中。 程序界面如下图所示,可以支持外框和迭代次数的更改。 程序下载链接: Minkows…

图片拼图怎么做?4个方法打造具有高级感的拼图作品

被阿勒泰的日落治愈了,旅行中的每一刻都值得珍藏。 这次的阿勒泰之行,我不仅带回了一堆美好的回忆,还有手机里满满的精彩瞬间。从壮丽的山川到静谧的湖泊,从晨曦初现到夜幕降临,每一帧都是大自然的馈赠。但是&#xf…

三天速成数学建模国赛国奖全攻略

这里写目录标题 国赛考点🗒️🗒️01 国赛是如何评奖的?02 国赛历年题型和模型算法1)国赛赛题特点2)历年国赛赛题类型 建模手三天快速提升计划✨✨01 第一天:模型分类及国赛常见模型的用法了解1)…

图形化编程/Scratch/编程猫角色素材免费分享1-10期合集

今天给大家带来一些业余整理的scratch等图形化编程软件可以使用的角色素材图片分享,都是PNG格式的透明图片,scratch软件可直接上传角色使用(也支持编程猫等软件,因为素材是PNG格式,所有支持png格式的软件都可以使用&am…

【 OpenHarmony 系统应用源码解析 】-- Launcher 初体验

前言 最近因为业务需要,需要做一款 UI 定制的鸿蒙 Launcher,于是就开始了「找到代码」、「研究代码」、「魔改代码」的套路流程,仅以此文章作为知识备份和技术探讨所用,也希望能给其他小伙伴提供一些源码的解析思路,方…

uniapp小程序怎么判断滑动的方向

项目场景: 获取手机上手指滑动的距离超过一定距离 来操作一些逻辑 解决方案: 在uniapp中,可以通过监听触摸事件来判断滑动的方向。常用的触摸事件包括touchstart, touchmove, 和 touchend。通过这些事件的参数,可以计算出用户的滑…

【Android】最好用的网络库:Retrofit

最好用的网络库:Retrofit 文章目录 最好用的网络库:RetrofitRetrofit的基本用法Retrofit的使用逻辑Retrofit的基本操作处理复杂的接口地址类型进阶删除提交header中指定参数 Retrofit构建器的最佳写法Retrofit的使用封装 Retrofit的基本用法 Retrofit是一…

html2Canvas和jspdf导出长pdf

续使用html2canvas和jspdf导出pdf包含跨页以及页脚_jspdf.umd.min.js-CSDN博客我的这篇文章再写一种情况因为最近我也使用到了 具体的html2Canvas和jspdf的我就不说了,直接开始了, 在公共方法的文件夹中建立一个新的文件htmlToPdf.js用来写咱们得方法然…

SpringBoot SSM vue在线作业考试系统

SpringBoot SSM vue在线作业考试系统 首页 图片轮播 作业信息 通知公告 登录注册 留言板 个人中心 我的收藏 后台管理 登录注册 个人中心 教师信息管理 学生信息管理 学院信息管理 专业信息管理 班级信息管理 作业信息管理 作业提交管理 通知公告管理 试卷管理 试题管理 系统…

关于LLC知识14

1、LLC必须工作在感性区 2、为了降低LLC进入容性区后MOS管的电流应力&#xff0c;必须要选择快管&#xff0c;对体二极管的反向恢复参数有要求&#xff1a;trr<200ns 3、对于上下管的死区时间不能太短&#xff0c;否则电容无法充放电完成&#xff0c;就无法实现ZVS导通 如…

Nginx简单的安全性配置

文章目录 引言I Nginx简单的安全性配置禁止特定的HTTP方法限制URL长度禁止某些用户代理限制请求速率连接限制禁止访问某些文件类型II 常见的安全规则防御CC攻击User-Agent过滤GET-URL过滤GET-参数过滤POST过滤(sql注入、xss攻击 )引言 Nginx本身并不具备复杂的防火墙规则定制…

LeetCode题集-1- 两数之和

这个题目是什么意思呢&#xff1f;简单来说就是在一个数组中找出两个元素&#xff0c;使其和为我们设定的值&#xff0c;并且每个元素只能用一次。 如下图具体示例&#xff1a; 到这里不知道你是否已经有解题思路了呢&#xff1f; 解法一&#xff1a;双层循环 我第一反应就是…

2024了,Neo4j能显示节点图片吗?

经过一番调研&#xff0c;答案是官方的是不能的.但有一个中文版可以显示网络图片作为节点背景 如通义千问说说&#xff1a; Neo4j 图数据库本身并不直接支持在节点中存储和显示图片。但是&#xff0c;你可以通过几种方式间接实现这一功能&#xff1a;1. 存储图片URL 最简单的…

【数据结构】关于哈希表内部原理,你到底了解多少???(超详解)

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解关于哈希表的内部实现原理&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;http://t.csdnimg.cn/7D225 &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 目录 &a…

6.2K star!推荐一款开源混沌工程测试平台:Chaos Mesh

1、Chaos Mesh 介绍 Chaos Mesh是一个开源的混沌工程平台&#xff0c;旨在帮助用户在生产环境中测试、验证和优化其应用程序的可靠性和稳定性。通过引入故障注入和混沌工程原则&#xff0c;Chaos Mesh可以模拟各种故障场景&#xff0c;如网络延迟、节点故障、磁盘故障等&#…

JavaWeb JavaScript ⑧ DOM编程

在光芒万丈之前&#xff0c;我们都要欣然接受眼下的难堪和不易&#xff0c;接受一个人的孤独和无助&#xff0c;认真做好眼前的每一件事&#xff0c;你想要的都会有 —— 24.8.29 一、什么是DOM编程 简单来说&#xff1a;DOM(Document obiect Model)编程就是使用document对象的…

重大内幕!揭秘数据“零丢失”,全靠它

2017年&#xff0c;某运营商设备扩容&#xff0c;误删80万用户数据… 2020年初疫情期间&#xff0c;某电商公司恶意删库事件&#xff0c;导致业务停机3天&#xff0c;公司赔付1.5亿元人民币 “链家程序员删库”事件&#xff0c;恶意删除公司 9TB 数据&#xff0c;造成公司财务…

鸿蒙HarmonyOS开发:如何灵活运用服务卡片提升用户体验

文章目录 一、ArkTS卡片相关模块二、卡片事件能力说明三、卡片事件的主要使用场景3.1、使用router事件跳转到指定UIAbility3.1.1、卡片内按钮跳转到应用的不同页面3.1.2、服务卡片的点击跳转事件 3.2、通过message事件刷新卡片内容3.2.1、在卡片页面调用postCardAction接口触发…