力扣经典题目之->二叉树的前序遍历

news2024/11/15 21:38:34

一:题目

解释:

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.coloradmin.cn/o/2080226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java面试题--JVM大厂篇之JVM大厂面试题及答案解析(8)

💖💖💖亲爱的朋友们,热烈欢迎你们来到青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而我的博…

Linux开发环境搭建,虚拟机安装

开发环境搭建 一、VMware Workstation Pro软件简介 VMware Workstation Pro 是 VMware (威睿公司)发布的一代虚拟机软件,中文名称一般称 为 "VMware 工作站 ". 它的主要功能是可以给用户在单一的桌面上同时运行不同的操作系统…

安装WMware和Ubuntu并使用xShell连接

0、我的电脑配置 设备名称 hello 处理器 Intel(R) Core(TM) i7-10700K CPU 3.80GHz 3.79 GHz 机带 RAM 16.0 GB (15.9 GB 可用) 设备 ID 541EC230-9910-418C-9043-5FBBF8ED320C 产品 ID 00330-80000-00000-AA846 系统类型 64 位操作系统, 基于 x64 的处理器 笔和触控 没有可…

秃姐学AI系列之:残差网络 ResNet

目录 残差网络——ResNet 残差块思想 ResNet块细节 ResNet架构 总结 代码实现 残差块 两种 ResNet 块的情况 ResNet 模型 QA 由上图发现,只有当较复杂的函数类包含较小的函数类时,才能确保提高它们的性能。 对于深度神经网络,如果…

QGIS制图流程

在之前我们推送了QGIS的软件安装、插件安装、数据导入等基础操作,今天我们介绍一下QGIS的制图功能。QGIS的制图与ArcGIS Pro存在一定的区别,但是思路上相似。我们教程内容主要是参考QGIS官方文档: https://docs.qgis.org/3.34/en/docs/user_…

Android 中ebpf 的集成和调试

1. BPF 简介 BPF,是Berkeley Packet Filter的简称,最初构想提出于 1992 年。是一种网络分流器和数据包过滤器,允许早操作系统级别捕获和过滤计算机网络数据包。它为数据链路层提供了一个原始接口,允许发送和接收原始链路层数据包…

安卓中回调函数的使用

在Android开发中,回调函数是一种常见的编程模式,用于在某个任务完成时异步接收通知或数据。它们通常用于处理用户界面事件、完成网络请求、数据库操作或其他长时间运行的任务。回调(Callback)是一种允许某段代码通知另一段代码执行…

机器人学——机械臂轨迹规划-2

直线轨迹 线段转折点速度不连续 加速度状态讨论 double dot 多段直线轨迹,转折点利用二次方程转为圆弧 关键步骤 第一个线段处理 Vt V0 at , 此处的V0 0 , 利用函数连续性,左右速度相等,联立求解 sgn(x):符号函数 最后一个线段…

dubbo:dubbo服务负载均衡、集群容错、服务降级、服务直连配置详解(五)

文章目录 0. 引言1. dubbo负载均衡1.1 负载均衡算法1.2. dubbo负载均衡使用1.3 自定义负载均衡策略 2. dubbo服务容错2.1 8种服务容错策略2.2 自定义容错策略 3. dubbo服务降级(mock)4. dubbo服务直连5. 总结 0. 引言 之前我们讲解了dubbo的基本使用&am…

内部类java

内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(寄主)。 //外部类 public class people{//内部类public class heart{} } 内部类的使用场景、作用 1.当一个事物的内部&…

STM32学习笔记3---ADC,DMA

目录 ADC模拟数字转换器 规则组的四种转换模式 AD单通道 AD多通道 常用代码函数相关 DMA直接存储器 存取(访问) 两个应用 DMA存储器到存储器的转运 ADCDMA ADC模拟数字转换器 stm32数字电路,只有高低电平,无几V电压的概念…

MySQL:常用函数

MySQL:常用函数 日期时间函数字符串函数数学函数加密函数 在MySQL中,存在许多现成的函数,可以简化部分操作,本博客讲解MySQL中的常用函数。 日期时间函数 current_date current_date函数用于输出当前的日期: curren…

一道关于php文件包含的CTF题

一、源码 这是index.php的页面。 点击login后会发现url里多了action的参数&#xff0c;那么我们就可以通过它来获取源码。 ?actionphp://filter/readconvert.base64-encode/resourcelogin.php 再通过base64的解码可以查看源码。 index.php源码&#xff1a; <?php erro…

【编码解码】CyberChef v10.18.9

下载地址 【编码解码神器】CyberChef v10.18.9 在线地址 CyberChef (gchq.github.io) 简介 CyberChef 是一个简单易用的网页应用&#xff0c;&#xff0c;包含了四百多种在线编解码工具。它在浏览器中执行各种“网络安全”操作。这些操作包括简单的 XOR 和 Base64 编码、复…

基于单片机的无线空气质量检测系统设计

本设计以STC89C52单片机为核心&#xff0c;其中包含了温湿度检测模块、光照检测模块、PM2.5检测模块、报警电路、LCD显示屏显示电路、按键输入模块和无线传输模块来完成工作。首先&#xff0c;系统可以通过按键输入模块设置当前的时间和报警值&#xff1b;使用检测模块检测当前…

spring boot(学习笔记第十九课)

spring boot(学习笔记第十九课) Spring boot的batch框架&#xff0c;以及Swagger3(OpenAPI)整合 学习内容&#xff1a; Spring boot的batch框架Spring boot的Swagger3&#xff08;OpenAPI&#xff09;整合 1. Spring boot batch框架 Spring Batch是什么 Spring Batch 是一个…

个人网站免费上线

声明一下&#xff0c;小科用的是natapp&#xff0c;进行的 1.起步-下载安装 去浏览器搜索" natapp "&#xff0c;在官网下载&#xff0c;或者直接 点击下列网站 NATAPP-内网穿透 基于ngrok的国内高速内网映射工具https://natapp.cn/ 打开后下滑找到下载&#xff…

JMeter Plugins之内网插件问题解决

JMeter Plugins之内网插件问题解决 背景 在我司内部进行JMeter工具进行性能脚本开发时&#xff0c;为了提高测试效率&#xff0c;我们会用到部分JMeter提供的插件&#xff0c;但是在我司内网的情况下&#xff0c;我们如果直接点击JMeter界面右上角的插件按钮 弹出来的JMeter…

洛谷刷题(4)

P1089 [NOIP2004 提高组] 津津的储蓄计划 题目描述 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300 元钱&#xff0c;津津会预算这个月的花销&#xff0c;并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄&#xff0c;妈妈提出&#xff0c;津津可以随…

零基础5分钟上手亚马逊云科技 - AI模型内容安全过滤

在上一篇文章中&#xff0c;小李哥带大家深入调研亚马逊云科技AI模型平台Amazon Bedrock热门开发功能&#xff0c;了解了模型平台的文字/图片生成、模型表现评估和模型内容安全审核的实践操作。这次我们将继续介绍如何利用API的形式&#xff0c;利用Python代码的形式对AI模型内…