每日一题——二叉树的前序遍历和中序遍历和后序遍历

文章目录

  • 二叉树的前序、中序与后序遍历
    • 题目描述
      • 数据范围:
      • 示例:
        • 示例 1:
    • 解题思路
      • 1. 递归法
      • 2. 迭代法
    • 代码实现(递归法)
      • 代码解析
      • 示例输出
      • 复杂度分析
    • 中序遍历
    • 后序遍历

二叉树的前序、中序与后序遍历

题目描述

给定一棵二叉树的根节点 root,返回其节点值的前序遍历。前序遍历的顺序是:首先访问当前节点,然后访问左子树,最后访问右子树。

数据范围:

  • 二叉树的节点数量满足 1 ≤ n ≤ 100 1 \leq n \leq 100 1n100
  • 每个节点的值满足 1 ≤ v a l ≤ 100 1 \leq val \leq 100 1val100,且所有节点值各不相同。

示例:

示例 1:

在这里插入图片描述

输入:

{1, #, 2, 3}

返回值:

[1, 2, 3]

解题思路

前序遍历二叉树的方式有两种:递归法和迭代法。

1. 递归法

前序遍历的顺序为:

  • 访问当前节点
  • 递归地遍历左子树
  • 递归地遍历右子树

递归法的实现非常简单,只需要依次访问节点即可。

2. 迭代法

迭代法通过栈来模拟递归过程。通过栈管理节点,先将根节点入栈,然后每次从栈中取出一个节点,访问其值,并将其右子节点和左子节点依次压入栈中。这样,左子节点会被优先访问,符合前序遍历的顺序。

代码实现(递归法)

以下是递归法的实现代码,我们通过辅助函数 Traversal 来进行前序遍历,并将遍历的结果保存在一个数组中。

#include <stdio.h>
#include <stdlib.h>// 定义二叉树节点结构
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;
};/*** 递归遍历二叉树* @param root 当前节点* @param returnSize 返回的数组大小* @param result 存储遍历结果的数组*/
void Traversal(struct TreeNode* root, int* returnSize, int* result) {if (!root) return;  // 如果当前节点为空,直接返回// 将当前节点的值添加到结果数组中result[*returnSize] = root->val;// 增加返回数组的大小计数(*returnSize)++;// 递归遍历左子树Traversal(root->left, returnSize, result);// 递归遍历右子树Traversal(root->right, returnSize, result);
}/*** 前序遍历主函数* @param root 二叉树的根节点* @param returnSize 返回的数组大小* @return 遍历结果数组*/
int* preorderTraversal(struct TreeNode* root, int* returnSize) {// 为返回数组分配足够的内存int* result = (int*)malloc(1000 * sizeof(int));// 初始化返回的数组大小为0*returnSize = 0;// 调用辅助函数进行前序遍历Traversal(root, returnSize, result);// 返回遍历结果return result;
}// 测试用例
int main() {// 创建一个简单的二叉树struct TreeNode root = {1, NULL, NULL};struct TreeNode left = {2, NULL, NULL};struct TreeNode right = {3, NULL, NULL};root.left = &left;root.right = &right;int returnSize;int* result = preorderTraversal(&root, &returnSize);// 打印结果for (int i = 0; i < returnSize; i++) {printf("%d ", result[i]);}printf("\n");// 释放内存free(result);return 0;
}

代码解析

  1. TreeNode结构体

    • 这是二叉树的节点结构,包含节点值 val、左子节点指针 left 和右子节点指针 right
  2. Traversal函数

    • 该函数负责递归地遍历二叉树。每当访问一个节点时,将该节点的值存入结果数组 result,并递归遍历左子树和右子树。
  3. preorderTraversal函数

    • 该函数是前序遍历的入口。它首先为结果数组分配内存,然后调用 Traversal 函数来执行遍历。
    • 最终返回遍历结果的数组。
  4. 内存管理

    • 结果数组 result 是动态分配的,并且在使用完后会在主函数中释放。

示例输出

对于下面的二叉树:

    1/ \2   3

输出结果为:

1 2 3

复杂度分析

  • 时间复杂度:O(n),其中n是二叉树中的节点数。每个节点都会被访问一次。
  • 空间复杂度:O(n),用于存储结果数组和递归栈空间。递归调用的最大深度为树的高度,最坏情况下为O(n),即树退化为链表。

中序遍历

中序遍历与前序遍历类似,唯一不同的是访问节点的顺序,先访问左子树,再访问当前节点,最后访问右子树。

#include <stdio.h>
#include <stdlib.h>// 定义二叉树节点结构
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;
};/*** 递归遍历二叉树的中序遍历* @param root 当前节点* @param returnSize 返回的数组大小* @param result 存储遍历结果的数组*/
void Traversal(struct TreeNode* root, int* returnSize, int* result) {if (!root) return;  // 如果当前节点为空,直接返回// 递归遍历左子树Traversal(root->left, returnSize, result);// 将当前节点的值添加到结果数组中result[*returnSize] = root->val;// 增加返回数组的大小计数(*returnSize)++;// 递归遍历右子树Traversal(root->right, returnSize, result);
}/*** 中序遍历主函数* @param root 二叉树的根节点* @param returnSize 返回的数组大小* @return 遍历结果数组*/
int* inorderTraversal(struct TreeNode* root, int* returnSize) {// 为返回数组分配足够的内存int* result = (int*)malloc(1000 * sizeof(int));// 初始化返回的数组大小为0*returnSize = 0;// 调用辅助函数进行中序遍历Traversal(root, returnSize, result);// 返回遍历结果return result;
}// 测试用例
int main() {// 创建一个简单的二叉树struct TreeNode root = {1, NULL, NULL};struct TreeNode left = {2, NULL, NULL};struct TreeNode right = {3, NULL, NULL};root.left = &left;root.right = &right;int returnSize;int* result = inorderTraversal(&root, &returnSize);// 打印结果for (int i = 0; i < returnSize; i++) {printf("%d ", result[i]);}printf("\n");// 释放内存free(result);return 0;
}

后序遍历

后序遍历的顺序为:

  • 先遍历左子树
  • 再遍历右子树
  • 最后访问当前节点
/*** struct TreeNode {*  int val;*  struct TreeNode *left;*  struct TreeNode *right;* };*//*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param root TreeNode类* @return int整型一维数组* @return int* returnSize 返回数组行数*/
void Traversal(struct TreeNode* root, int* returnSize, int* result) {if (!root) return;  // 如果当前节点为空,直接返回// 递归遍历左子树Traversal(root->left, returnSize, result);// 递归遍历右子树Traversal(root->right, returnSize, result);// 将当前节点的值添加到结果数组中result[*returnSize] = root->val;// 增加返回数组的大小计数(*returnSize)++;
}int* postorderTraversal(struct TreeNode* root, int* returnSize) {// 为返回数组分配足够的内存int* result = (int*)malloc(1000 * sizeof(int));// 初始化返回的数组大小为0*returnSize = 0;// 调用辅助函数进行后序遍历Traversal(root, returnSize, result);// 返回遍历结果return result;
}

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

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

相关文章

【优选算法】8----四数之和

有看过我上篇算法博客并且去做过的铁子们&#xff0c;对这道题的话应该就不会那么陌生了&#xff0c;因为这两道题 的解题思路有着异曲同工之妙~ -----------------------------------------begin------------------------------------- 题目解析&#xff1a; 跟三数之和就多了…

【开源免费】基于SpringBoot+Vue.JS校园失物招领系统(JAVA毕业设计)

本文项目编号 T 150 &#xff0c;文末自助获取源码 \color{red}{T150&#xff0c;文末自助获取源码} T150&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

2025美赛倒计时,数学建模五类模型40+常用算法及算法手册汇总

数学建模美赛倒计时&#xff0c;对于第一次参加竞赛且没有相关基础知识的同学来讲&#xff0c;掌握数学建模常用经典的模型算法知识&#xff0c;并熟练使用相关软件进行建模是关键。本文将介绍一些常用的模型算法&#xff0c;以及软件操作教程。 数学建模常用模型包括&#xf…

【深度学习】常见模型-循环神经网络(Recurrent Neural Network, RNN)

循环神经网络&#xff08;RNN&#xff09; 概念简介 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一种用于处理序列数据&#xff08;如时间序列、文本序列等&#xff09;的神经网络模型。与传统神经网络不同&#xff0c;RNN 的结构具有记忆能力&…

Matlab总提示内存不够用,明明小于电脑内存

目录 前言情况1&#xff08;改matlab最大内存限制&#xff09;情况2&#xff08;重启电脑&#xff09;情况3 前言 在使用matlab中&#xff0c;有时候需要占用的内存并没有超过电脑内存依旧会报错&#xff0c;提示内存不够用&#xff0c;可以尝试下面几种方法&#xff0c;总有一…

数据结构(Java)——二叉树

1.概念 二叉树是一种树形数据结构&#xff0c;其中每个节点最多有两个子节点&#xff0c;通常被称为左子节点和右子节点。二叉树可以是空的&#xff08;即没有节点&#xff09;&#xff0c;或者由一个根节点以及零个或多个左子树和右子树组成&#xff0c;其中左子树和右子树也分…

Windows电脑上记录工作待办清单的工具用哪个?

在Windows电脑上记录日常工作待办清单的工具用哪一个比较好呢&#xff1f;想要工作效率高&#xff0c;借助Windows电脑上的待办清单工具&#xff0c;可以帮助大家快速完成各项任务&#xff0c;今天给大家盘点几款工作待办清单工具。 Windows自带的便笺Stickynotes Windows自…

H266/VVC 量化编码中 JCCR 技术

色度联合编码 JCCR VVC 支持色度分量联合编码(Joint Coding of Chroma Residual&#xff0c;JCCR)&#xff0c; 两个色度残差联合编码。通过 TU 的标志位 tu_joint_cbcr_residual_flag 指定该工 具&#xff0c;并通过 CBF 来隐式传输所选的模式。仅当 TU 的至少一个色度分量的 …

云原生时代,如何构建高效分布式监控系统

文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目&#xff0c;由于其良好的架构设计和完善的生态&#xff0c;迅速成为了监控…

DAY3,模拟终端

题目 实现一个终端的功能&#xff0c;注意需要带有cd功能 思路 如何 C语言执行shell命令&#xff1f; 使用进程替换exec函数&#xff1b;&#xff1b;使用system函数。 如何 切换工作目录&#xff1f; 使用chdir函数切换工作目录。 其…

一键视频转文字/音频转文字,浏览器右键提取B站视频文案,不限时长免费无限次可用

上篇文章阿虚分享了自己的「短视频」笔记方案 短视频文件小&#xff0c;易存储&#xff0c;所以阿虚建议是直接将原视频插入到笔记当中 而长视频文件大&#xff0c;很难像短视频一样操作。阿虚之前的建议是提取重要部分视频转长截图&#xff0c;或者视频转GIF 但上述方案仔细…

【C++】详细讲解继承(上)

C面向对象的三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态。现在我们就介绍一下继承。 1.继承的概念及定义 1.1 继承的概念 继承机制是⾯向对象程序设计使代码可以 复⽤ 的最重要的⼿段。我们前面接触到的都是 函数 层次的复用&#xff0c;遇到过的 类 层次的复…

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器,支持轨迹控制与相机镜头控制

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器&#xff0c;支持轨迹控制与相机镜头控制 学习前言相关地址汇总源码下载地址HF测试链接MS测试链接 测试效果Image to VideoText to Video轨迹控制镜头控制 EasyAnimate详解技术储备Qwen2 VLStable Diffusion …

1905电影网中国地区电影数据分析(一) - 数据采集、清洗与存储

文章目录 前言一、数据采集步骤及python库使用版本1. python库使用版本2. 数据采集步骤 二、数据采集网页分析1. 分析采集的字段和URL1.1 分析要爬取的数据字段1.2 分析每部电影的URL1.2 分析每页的URL 2. 字段元素标签定位 三、数据采集代码实现1. 爬取1905电影网分类信息2. 爬…

【25】Word:林涵-科普文章❗

目录 题目​ NO1.2.3 NO4.5.6 NO7.8 NO9.10 NO11.12 不连续选择&#xff1a;按住ctrl按键&#xff0c;不连续选择连续选择&#xff1a;按住shift按键&#xff0c;选择第一个&#xff0c;选择最后一个。中间部分全部被选择 题目 NO1.2.3 布局→纸张方向&#xff1a;横向…

P6周:VGG-16算法-Pytorch实现人脸识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 我的环境 语言环境&#xff1a;Python 3.8.12 编译器&#xff1a;jupyter notebook 深度学习环境&#xff1a;torch 1.12.0cu113 一、前期准备 1.设置GPU im…

【Rust自学】14.4. 发布crate到crates.io

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 14.4.1. 创建并设置crates.io账号 在发布任何 crate 之前&#xff0c;你需要在 crates.io并…

数据结构——实验八·学生管理系统

嗨~~欢迎来到Tubishu的博客&#x1f338;如果你也是一名在校大学生&#xff0c;正在寻找各种编程资源&#xff0c;那么你就来对地方啦&#x1f31f; Tubishu是一名计算机本科生&#xff0c;会不定期整理和分享学习中的优质资源&#xff0c;希望能为你的编程之路添砖加瓦⭐&…

IBM湖仓一体与向量数据库:访问MinIO控制台(Accessing the MinIO console)

_1、从密钥中复制S3凭证并保存 &#xff08;Copy the S3 credentials from the secret and save it &#xff09; oc extract secret/ibm-lh-config-secret -n ${PROJECT_CPD_INST_OPERANDS} --to- --keysenv.properties | grep -E "LH_S3_ACCESS_KEY|LH_S3_SECRET_KEY&q…

Ragas-RAG能力评测

Ragas是一个框架&#xff0c;它可以帮助你从不同的方面评估你的问答&#xff08;QA&#xff09;流程。它为你提供了一些指标来评估你的问答系统的不同方面&#xff0c;具体包括&#xff1a; 评估检索&#xff08;context&#xff09;的指标&#xff1a;提供了上下文相关性&…