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

文章目录

  • 二叉树的前序、中序与后序遍历
    • 题目描述
      • 数据范围:
      • 示例:
        • 示例 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 国内…

NextJs - ServerAction获取文件并处理Excel

NextJs - ServerAction获取文件并处理Excel 一. 客户端二. ServerAction 处理 一. 客户端 use client; import { uploadExcel } from actions/batchInquirySystem/api; import type { UploadProps } from antd; import { Upload } from antd;/*** 创建问询内容*/ const Page …

C++/CLI(Common Language Runtime)关键点详解

C++/CLI(Common Language Runtime)是 Microsoft Visual C++ 的一个扩展,允许使用 .NET Framework 的功能,同时保留对本机 C++ 代码的访问。当您需要在 C++ 和 C# 之间进行互操作时,C++/CLI 是一种常见的选择,因为它可以作为桥梁,将托管代码(如 C#)与非托管代码(如 C+…

python 找出合并并排序两个有序列表后的第n个最小元素

编写一个程序&#xff0c;找出合并并排序两个有序列表后的第n个最小元素。 定义函数find_smallest_number()&#xff0c;该函数接受三个参数&#xff1a;两个列表和一个整数n。假设输入的列表始按升序排序。在函数内部&#xff0c;按升序合并两个列表。然后&#xff0c;从列表…

android wifi 热点名称的默认配置

在android11里 frameworks/opt/net/wifi/service/res/values/config.xml 281 <string name"wifi_tether_configure_ssid_default" translatable"false">AndroidAP</string> 282 <!-- Do not translate. Default access point SSID…

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;其中左子树和右子树也分…

PyTest自学 - pytest夹具使用初步

<< 返回目录 1 PyTest自学 - pytest夹具使用初步 夹具可以为测试用例提供资源(测试数据)、执行预置条件、执行后置条件&#xff0c;夹具可以是函数、类或模块&#xff0c;使用pytest.fixture装饰器进行标记。 1.1 夹具的作用范围 夹具的作用范围&#xff1a; 函数范围…

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 的至少一个色度分量的 …

ZooKeeper 数据模型

ZooKeeper 数据模型 ZooKeeper 拥有层次化的命名空间&#xff0c;类似分布式文件系统&#xff0c;但每个节点不仅能有子节点&#xff0c;还可关联数据。节点路径为规范的绝对路径&#xff0c;用斜杠分隔&#xff0c;无相对引用。路径命名有如下约束&#xff1a; 路径名不能包…

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

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

关于扫雷的自动补空实现C语言

关于扫雷的自动补空实现C语言 相信很多朋友在用C语言实现扫雷功能时&#xff0c;都想实现扫雷里面的的自动补足功能&#xff0c;但总是难以实现&#xff0c;在这里我将分享一种方法——递归思想 先看代码&#xff01; 位置在game.c //判断附近雷区并过滤空白区&#xff08;…

图形化数据报文转换映射工具

目录 概要整体架构流程技术名词解释技术细节小结 概要 在当今数字化时代&#xff0c;数据的处理和分析是企业、科研机构以及各类组织日常运营的核心环节。数据来源广泛&#xff0c;格式多样&#xff0c;常见的数据格式包括XML&#xff08;可扩展标记语言&#xff09;和JSON&a…

LINUX下设置分离状态(Detached State)和未设置分离状态的主要区别在于线程资源的管理方式和线程的生命周期。以下是两种状态的对比:

1. 设置分离状态&#xff08;Detached State&#xff09; 资源管理&#xff1a; 线程终止时&#xff0c;系统会自动释放与线程相关的所有资源&#xff08;如线程栈、线程控制块&#xff09;。不需要其他线程显式回收&#xff08;pthread_join&#xff09;。 线程生命周期&…

微前端qiankun的基本使用(vue-element-admin作为项目模版)

微前端qiankun的基本使用(vue-element-admin作为项目模版) qiankun架构特点主应用netmoni_master改造工程项目目录结构子项目配置:子应用注册配置项container:子应用挂载节点配置项activeRule:子应用路由子应用netmoni_child1改造目录结构项目配置:src/settings中配置子应…

使用PHP函数 “is_object“ 检查变量是否为对象类型

在PHP中&#xff0c;变量可以保存不同类型的值&#xff0c;包括整数、字符串、数组、布尔值等等。其中&#xff0c;对象是一种特殊的数据类型&#xff0c;用于封装数据和方法。在处理PHP代码中&#xff0c;我们经常需要检查一个变量是否为对象类型&#xff0c;以便进行相应的处…