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

一、如何遍历二叉树

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

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

以上图为例:

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

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

面试问题:hash和history的区别

问: hash和history的区别 回答: ‌工作原理‌: ‌hash模式‌:利用锚点技术,通过改变URL中的hash部分(即#后面的部分)来实现页面跳转,不会重新加载页面。例如,URL变为ht…

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 >元素用于在判断该语句是否满足特定条…

django各个文件简单介绍

templates 存放前端的模板文件 manage.py django的命令行工具 venv 这个目录是虚拟环境的相关文件 __pycache__ 编译后的文件夹&#xff0c;不执行则无 Include: python 编译器的C语言头文件源码 Lib: python的标准库&#xff0c;库都安装在这里面的site-packages文件夹里 Sc…

npm入门教程6:npm脚本

一、npm脚本的基本用法 定义脚本 在package.json文件的scripts字段中&#xff0c;你可以定义多个脚本命令。每个脚本都是一个键值对&#xff0c;其中键是脚本的名称&#xff0c;值是要执行的命令。例如&#xff1a; "scripts": {"start": "node index…

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…

英语写作中“出于……”out of的用法

out of &#xff08;出于……&#xff09;是我们容易忽略但比较实用的表达。“出于……的考虑”、“出于……担忧”等在英语写作中用out of表达&#xff1a; out of consideration/concern/responsibility/respect/…… 例如&#xff1a; The service provider deploys mult…

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

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时&#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;思考路径 …

质数筛c++

题目描述 输入 nn 个不大于 10^510^5 的正整数。要求全部储存在数组中&#xff0c;去除掉不是质数的数字&#xff0c;依次输出剩余的质数。 输入格式 第一行输入一个正整数 nn&#xff0c;表示整数个数。 第二行输入 nn 个正整数 aiai​&#xff0c;以空格隔开。 输出格式…

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

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

AI伦理挑战:应对之道

AI伦理挑战&#xff1a;应对之道 人工智能&#xff08;AI&#xff09;如同一把双刃剑&#xff0c;它在为生活带来便利的同时&#xff0c;也引发了深刻的伦理挑战。今天&#xff0c;我们将深入探讨AI发展的伦理挑战&#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…

Decision Tree Regressor (决策树) --- 论文实战

一、前言 在《机器学习论文复现实战---linear regression》中通过Pearson 相关性分析,去除了2个高相关性特征 "PN" 和 "AN" ,数据维度变为890*25。(数据集地址) 这里我们不做前期处理,直接就将数据放入 DecisionTreeRegressor 模型中进行训练了。 二…

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

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