【数据结构】二叉树——前中后序遍历

一、如何遍历二叉树

在这里插入图片描述
以图上这个二叉树作为例子,我们若想要访问二叉树中每一个元素
我们一般是采用递归的方式

比如我们要访问完整个二叉树,我们进行递归先访问根的左子树,然后因为递归再次调用,我们会先一直访问二叉树左子树,直到为空时返回,再访问右子树进行递归直到将整棵二叉树访问完毕
在这里插入图片描述

以上图为例:

• 我们若想访问整个二叉树

• 从 B 开始,我们访问左子树,访问到 D
• 从 D 开始,我们访问左子树,访问到 NULL
• 返回
• 从 D 开始,我们访问右子树,访问到 NULL
• 返回

• D 的左右两子树都以访问完毕,返回

对于 B 来说左子树已经访问完毕,接下来访问 B 的右子树

• 从 B 开始,我们访问右子树,访问到 E
• 从 E 开始,我们访问左子树,访问到 NULL
• 返回
• 从 E 开始,我们访问右子树,访问到 H
• 从 H 开始,我们访问左子树,访问到 NULL
• 返回
• 从 H 开始,我们访问右子树,访问到 NULL
• 返回
• H 的左右子树已经访问完毕,返回
• E 的左右子树已经访问完毕,返回
• B 的左右子树已经访问完毕
• 至此整个二叉树访问完毕

二、什么是二叉树的前中后序遍历

所谓的前中后序遍历其实就是我们访问二叉树时读取数据的顺序

在这里插入图片描述

我们在访问数据时我们可以选择将该节点的数据取出来,或者接着向下遍历,我们取出节点数据在遍历过程的顺序就是前中后序
在这里插入图片描述
我们先手搓一个如上图的二叉树

1、二叉树节点

在这里插入图片描述
一个二叉树节点中存储三个信息

val : 用于存储节点的数据,可以是不同的数据类型
left : 用于存储左子树节点的地址
right : 用于存储右子树节点的地址

2、二叉树节点初始化

在这里插入图片描述

3、手搓二叉树

接下来我们按照下图二叉树,手搓一个二叉树
在这里插入图片描述

BTNode* node1 = BTInit('A');
BTNode* node2 = BTInit('B');
BTNode* node3 = BTInit('C');
BTNode* node4 = BTInit('D');
BTNode* node5 = BTInit('E');
BTNode* node6 = BTInit('F');
BTNode* node7 = BTInit('G');
BTNode* node8 = BTInit('H');
//BTNode* node9 = BTInit('t');node1->left = node2;
node1->right = node3;
node2->left = node4;
node2->right = node5;
node3->left = node6;
node3->right = node7;
node5->right = node8;
//node8->left = node9;

4、前序遍历

//遍历二叉树(前序遍历)
void BTPrevOrder(BTNode* pbt)
{if (pbt == NULL){printf("# ");return;}printf("%c ", pbt->val);BTPrevOrder(pbt->left);BTPrevOrder(pbt->right);
}

前序遍历,我们每次访问到一个节点就将它打印出来,然后先向左子树递归,再向右子树递归
在这里插入图片描述

5、中序遍历

//遍历二叉树(中序遍历)
void BTInOrder(BTNode* pbt)
{if (pbt == NULL){printf("# ");return;}BTInOrder(pbt->left);printf("%c ", pbt->val);BTInOrder(pbt->right);
}

我们发现中序遍历与前序遍历的不同就只在打印的数值的位置不同,中序遍历就相当于先向左一直递归,但是不打印数据,当节点的左子树被访问完后,再访问根节点,然后再访问右子树
在这里插入图片描述

6、后序遍历

//遍历二叉树(后序遍历)
void BTPostOrder(BTNode* pbt)
{if (pbt == NULL){printf("# ");return;}BTPostOrder(pbt->left);BTPostOrder(pbt->right);printf("%c ", pbt->val);
}

后序遍历就是再左右子树都访问完后再打印数据
在这里插入图片描述

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

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

相关文章

桑基图在医学数据分析中的更复杂应用示例

桑基图(Sankey Diagram)能够有效地展示复杂的流动关系,特别适合用于医学数据分析中的多种转归和治疗路径的可视化。接下来,我们将构建一个稍微复杂的示例,展示不同疾病患者在治疗过程中的流动,以及他们的治…

WPS 表格奇数行或偶数行填充颜色(Excel也适用)

今天在做项目测试用例,全都是白色底纹,日以继夜的赶项目 大家都头脑不清晰了,看着容易错行,看我一键更新 如本次测试用例,单元格区域的奇数行填充灰色。 点击单元格最左上角选定区域,然后依次点击【开始】…

RT-DETR:替代YOLO的更快实时对象检测模型(附代码)

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

JavaScript。—关于语法基础的理解—

一、程序控制语句 JavaScript 提供了 if 、if else 和 switch 3种条件语句&#xff0c;条件语句也可以嵌套。 &#xff08;一&#xff09;、条件语句 1、单向判断 &#xff1a; if... &#xff08;1&#xff09;概述 < if >元素用于在判断该语句是否满足特定条…

ComfyUI - ComfyUI 工作流中集成 SAM2 + GroundingDINO 处理图像与视频 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143359538 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 SAM2 与…

Android13预置应用及授权开发

在android13中&#xff0c;要预置一个对讲应用&#xff0c;从预置和授权&#xff0c;梳理了一下&#xff0c;以便后续查询使用。在此记录 一放置应用 我的apk应用放在vendor下面&#xff0c; 路径&#xff1a;projectroot/vendor/fly/package/apps/DMR/flydmr.apk (vendor/fl…

【密码学】全同态加密基于多项式环计算的图解

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时&#xff0c;得出问题的答案。 这篇文章的整体结构包括多项式环相关的数学介绍&#xff0c;基于多项式环的加密和解密是如何工作的&…

[java][框架]springMVC(1/2)

目标 知道SpringMVC的优点编写SpringMVC入门案例使用PostMan发送请求掌握普通类型参数传递掌握POJO类型参数传递掌握json数据参数传递掌握响应json数据掌握rest风格快速开发 一、SpringMVC简介 1 SpringMVC概述 问题导入 SpringMVC框架有什么优点&#xff1f; 1.1 Spring…

基于STM32健康监控系统/智能手环/老人健康检测系统/心率血氧血压

基于STM32健康监控系统/智能手环/老人健康检测系统/心率血氧血压 持续更新&#xff0c;欢迎关注!!! 基于STM32健康监控系统/智能手环/老人健康检测系统/心率血氧血压 随着人民生活质量的提高和生活节奏的加快&#xff0c;人体健康监测成为全球关注的焦点之一。基于物联网的人体…

百度文心智能体:巧用汉字笔画生成与汉字搜索插件,打造一个学习汉字的教育类智能体

这篇文章&#xff0c;主要介绍如何巧用汉字笔画生成与汉字搜索插件&#xff0c;打造一个学习汉字的教育类智能体。 目录 一、教育类智能体 1.1、智能体演示 1.2、智能体插件 1.3、智能体prompt &#xff08;1&#xff09;角色和目标 &#xff08;2&#xff09;思考路径 …

Efficient Cascaded Multiscale Adaptive Network for Image Restoration 论文阅读笔记

Efficient Cascaded Multiscale Adaptive Network for Image Restoration 论文阅读笔记 这是新国立和新加坡管理大学发表在ECCV2024上的一篇image restoration的文章&#xff0c;提出了一个新的网络结构ECMA&#xff0c;从实验结果上看在超分&#xff0c;去噪&#xff0c;去模糊…

Python | Leetcode Python题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; class Solution:def findMaxLength(self, nums: List[int]) -> int:# 前缀和字典: key为1的数量和0的数量的差值,value为对应坐标hashmap {0:-1}# 当前1的数量和0的数量的差值counter ans 0for i,num in enumerate(nums):# 每多一个1…

微服务架构深入理解 | 技术栈

微服务架构深入理解 | 技术栈 服务网关 服务网关是在微服务架构中扮演重要角色的组件&#xff0c;它是系统对外的入口&#xff0c;负责接收和处理客户端的请求&#xff0c;并将请求路由到相应的微服务。服务网关常常与API管理、负载均衡、安全认证、流量控制等功能结合&#xf…

Java日志脱敏——基于logback MessageConverter实现

背景简介 日志脱敏 是常见的安全需求&#xff0c;最近公司也需要将这一块内容进行推进。看了一圈网上的案例&#xff0c;很少有既轻量又好用的轮子可以让我直接使用。我一直是反对过度设计的&#xff0c;而同样我认为轮子就应该是可以让人拿去直接用的。所以我准备分享两篇博客…

目标追踪DeepSort

一、卡尔曼滤波 你可以在任何对某个动态系统有 “不确定信息” 的地方使用卡尔曼滤波器&#xff0c;并且可以对系统下一步的行为做出 “有根据的猜测”。即使混乱的现实干扰了你所猜测的干净运动&#xff0c;卡尔曼滤波器通常也能很好地确定实际发生了什么。它还可以利用你可能…

数据结构与算法——Java实现 53.力扣938题——二叉搜索树的范围和

生命的意义 在于活出自我 而不是成为别人眼中的你 —— 24.11.3 938. 二叉搜索树的范围和 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 …

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖、z-index应用及性能分析

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖、z-index应用及性能分析 目录 微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖、z-index应用及性能分析 1、iOS在scroll-view内部上下滑动吸顶的现象 正常的上下滑动吸顶…

免费好用又好看且多端自动同步第三方终端工具Termius你值得拥有

使用目的&#xff1a; 本地终端功能一样&#xff0c;都是为了登录服务器查看日志等操作。 本地终端 优点&#xff1a;方便简单&#xff0c;无需额外下载安装、免费。 缺点&#xff1a;每次都需要重新登陆输入命令&#xff0c;步骤繁琐无法简化&#xff1b;不能跨端同步。 第…

Unity引擎材质球残留贴图引用的处理

大家好&#xff0c;我是阿赵。   这次来分享一下Unity引擎材质球残留贴图引用的处理 一、 问题 在使用Unity调整美术效果的时候&#xff0c;我们很经常会有这样的操作&#xff0c;比如&#xff1a; 1、 同一个材质球切换不同的Shader、 比如我现在有2个Shader&#xff0c;…

【electron+vue3】使用JustAuth实现第三方登录(前后端完整版)

实现过程 去第三方平台拿到client-id和client-secret&#xff0c;并配置一个能够外网访问回调地址redirect-uri供第三方服务回调搭建后端服务&#xff0c;引入justauth-spring-boot-starter直接在配置文件中定义好第一步的三个参数&#xff0c;并提供获取登录页面的接口和回调…