【数据结构】二叉树的遍历递归算法详解

二叉树的遍历

  • 💫二叉树的结点结构定义
  • 💫创建一个二叉树结点
  • 💫在主函数中手动创建一颗二叉树
  • 💫二叉树的前序遍历
  • 💫调用栈递归——实现前序遍历
  • 💫递归实现中序和后序遍历

💫二叉树的结点结构定义

typedef struct BinaryTreeNode
{int val;struct BinaryNode* left;struct BinaryNode* right;
}BTNode;

💫创建一个二叉树结点

我们来写一个函数BuyNode(x)函数用于创建二叉树结点。
用动态开辟函数malloc函数进行动态开辟,并强制转换为BTNode型,用变量node来去管理开辟的空间。
我们初始化结点,其val即为传入的参数x,左右指针leftright都设为NULL。

//创建一个二叉树结点
BTNode* BuyNode(int x)
{BTNode* node = (BTNode*)malloc(sizeof(BTNode));if (node == NULL){perror("malloc fail");}else{node->val = x;node->left = NULL;node->right = NULL;}
}

💫在主函数中手动创建一颗二叉树


我们在主函数中创建上面这样一颗二叉树。
首先,我们需要开辟6个结点,但此时6个结点之间没有任何的联系,我们需要改变其中一些结点的指针域left和right,来使得结点之间产生联系。

int main()
{BTNode* node1 = BuyNode(1);BTNode* node2 = BuyNode(2);BTNode* node3 = BuyNode(3);BTNode* node4 = BuyNode(4);BTNode* node5 = BuyNode(5);BTNode* node6 = BuyNode(6);node1->left = node2;node1->right = node4;node1->right=node3;node2->left = node4;node3->left = node5;node3->right = node6;return 0;
}

💫二叉树的前序遍历

首先,我们先要了解以下二叉树前序的前序遍历。
二叉树的前序遍历:
根-->左子树-->右子树
对于我们上面的这颗二叉树:

1-->左-->

左子树和右子树也采用前序遍历的方式:

左子树:

2-->4

右子树

3-->5-->6

所以这颗二叉树的前序遍历为:

1-->2-->4-->3-->5-->6

正是由于这样的思想,将一个树根-->左-->右仍然是一颗树,接着再拆分…直到左子树和右子树的左右结点为空时。
所以这样的思想,我们就利用递归的想法就可以完成一颗二叉树的遍历。

💫调用栈递归——实现前序遍历

调用栈:程序在执行时,如果程序调用一个函数,它会先把这个函数压入栈中,等到这个函数返回结果(return )后,它才会从栈中弹出。
递归程序在执行时,会不断地调用自身,把函数压入栈中,当最后一个函数,也就是基线条件出现时,再逐渐清空栈空间。

下面我们根据这段代码来画图理解一些递归的思想。

//递归前序遍历一棵树
void PreOrder(BTNode* root)
{if (root == NULL){printf("NULL");return;}printf("%d", root->val);PreOrder(root->left);PreOrder(root->right);return 0;
}


我们按照步骤来执行以下程序:
主函数中进行了函数调用,参数为node1
压栈:

node1不为空,打印结点:

执行PreOrder(root->left),再次调用函数,参数为node2
进行压栈:

node2不为空,打印

执行PreOrder(root->left),再次调用函数,参数为node4,压栈:

node4不为空,打印:

执行PreOrder(root->left),再次调用函数,参数为NULL,压栈:

这是函数参数为NULL,进入if语句,进行打印 ,并return返回,这时出栈



y由于这段代码,当函数的参数为node4时,PreOrder(node4->left)已经有return,所以这时,程序会接着往下面执行PreOrder(node4->right)
这时再次调用函数,函数参数为NULL,压栈,打印,再出栈。


这时对于函数PreOrder (node4)已经执行完语句 PreOrder(node4->left)和语句PreOrder(node4->right)了,后执行 return 0,函数有返回结果,所以出栈


此时,我们该执行 node2的右结点了。
对于PreOrder(node2->right)中,函数函数即是NULL,所以先压栈,然后打印,然后出栈。



⑧此时,函数PreOrder(node2)PreOrder(node2->left)PreOrder(node2->right) 都已经执行完了,即已经对node2结点的左右子树遍历完成,执行return 0 返回,这时PreOrder(node2) 出栈。


在此时,我们已经对node1的左子树遍历完成,接下来同遍历左子树一样,我们对右子树进行遍历。




这时输出为:

💫递归实现中序和后序遍历

根据上面前序的递归,我觉得最重要的代码是:

	if (root == NULL){printf("NULL");return;}

它是递归中能否回溯的一个关键。
下面写中序遍历

//递归中序遍历二叉树
void Order(BTNode* root)
{if (root == NULL){printf("NULL ");return;}Order(root->left);printf("%d ", root->val);Order(root->right);return 0;
}

递归后序遍历一棵树:

//递归后序遍历一颗二叉树
void PostOrder(BTNode* root)
{if (root == NULL){printf("NULL ");return;}PostOrder(root->left);PostOrder(root->right);printf("%d ", root->val);return 0;
}

前中后序遍历结果分别为:

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

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

相关文章

看电影相关的日语,柯桥日语培训

1.映画を見たいです。 我想看电影。 2.どこの映画館(えいがかん)で上映(上映)しますか。 在哪里的影院上映? 3.どこで映画が見られますか。 哪里能看电影呢? 4&#x…

稳定扩散AI 纹理生成器

推荐基于稳定扩散(stable diffusion) AI 模型开发的自动纹理工具: DreamTexture.js自动纹理化开发包 - NSDT 什么是稳定扩散? 从技术上讲,Stable Diffusion 是一种用于机器学习的潜在扩散模型 (LDM)。这种类型的专用深…

【dbeaver】添加mysql高低版本选择驱动

添加mysql高低版本选择驱动 连接到数据库->全部->查询mysql MySQL 版本驱动 8.0 MySQL 5 版本驱动 5.7.x 其他需要就:https://downloads.mysql.com/archives/c-j/ 密码查看 项目设置密码: File -> Project security ->设置密码 It i…

解决项目开发过程需要多个if else的情况

项目开发过程中虽然不建议使用过多的if-else-else if,但是总有一些情况是避免不了,举一个例子: struct DataBase {std::string type_; };void Update(DataBase _data) {if (_data.type_ "UiSCLKey"){}else if (_data.type_ &quo…

Ubuntu 22.04 安装水星无线 USB 网卡

我的 USB 网卡是水星 Mercury 的, 在 Ubuntu 22.04 下面没有自动识别。 没有无线网卡的时候只能用有线接到路由器上,非常不方便。 寻思着把无线网卡驱动装好。折腾了几个小时装好了驱动。 1.检查网卡类型 & 安装驱动 使用 lsusb 看到的不一定是准确…

法治智能起航 | 拓世法宝AI智慧政务一体机重塑法治格局,开启智能司法新篇章

在科技的巨轮推动下,我们的社会正快速迈向一个以数据和智能为核心的新时代。在这个波澜壮阔的变革中,人工智能(AI)显得尤为突出,它不仅是科技进步的象征,更是未来发展的助力者。 2023年,最高人…

linux 3.13版本nvme驱动阅读记录四

这里记录下在nvme_probe函数调用misc_register函数的总结。 static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id) {//... create_cdev://利用miscdev结构体提供一些字符设备的操作(回调函数),用户空间可以下发一些nvme的命令等scnprintf…

医学影像系统源码(MRI、CT三维重建)

一、MRI概述 核磁共振成像(英语:Nuclear Magnetic Resonance Imaging,简称NMRI),又称自旋成像(英语:spin imaging),也称磁共振成像(Magnetic Resonance Imag…

Labview利用声卡捕获波形

一般的计算机上自带的声卡,均既有A/D功能,又有D/A功能,就是一款具备基本配置的数据采集卡,并且技术成熟,性能稳定。 后台如下:

【Word自定义配置,超简单,图文并茂】自定义Word中的默认配置,比如标题大小与颜色(参考科研作图配色),正文字体等

▚ 01 自定义样式Styles中的默认标题模板 📢自定义标题的显示效果,如下图所示: 1.1 自定义标题的模板Normal.dotm 1.1.1 选择所需修改的标题 新建一个空白Word文档,依次选择菜单栏的开始Home,样式Styles,…

低代码信创开发核心技术(三):MDA模型驱动架构及元数据系统设计

前言 写最后一篇文章的时候,我本人其实犹豫了半年,在想是否发布出这篇文章,因为可能会动了很多人的利益。所以这篇文章既是整个低代码信创开发的高度总结,也是最为精华的一部分,它点明了低代码中最为核心的技术。虽然…

光刻掩膜版怎么制作的?

光掩膜版基本上是 IC 设计的“主模板”。掩模版有不同的尺寸。常见尺寸为 6 x 6 英寸一般的掩膜版由石英或玻璃基板组成。光掩膜版涂有不透明薄膜。更复杂的掩模版使用其他材料。 一般来说,术语“photo mask”用于描述与 1X 步进机或光刻系统一起使用的“主模板”。…

Ubuntu 安装常见问题

1. 安装oh my zsh 搜狗输入法不能用 vim /etc/environmentexport XIM_PROGRAMfcitx export XIMfcitx export GTK_IM_MODULEfcitx export QT_IM_MODULEfcitx export XMODIFIERS“imfcitx” export LANG“zh_CN.UTF-8”配置完后重启,稍等一会,右上角会有个…

Windows下Python及Anaconda的安装与设置之保姆指南

学习Python编程需要安装基本的开发环境。 (1)python ——编译器;这个是任何语言都需要的;必需! (2)Anaconda ——主要的辅助工具,号称是 Python‘OS;必需! …

python机器学习——随机森林

随机森林 随机森林(Random Forest)是一种集成学习方法,它通过构建多个决策树并结合它们的预测结果来进行分类或回归。 算法原理: 决策树(Decision Tree): 随机森林由多个决策树组成。决策树是一种基于树…

如何在PPT中去除编辑密码?

:忘记PPT幻灯片密码?最简单的办法在这里! 【摘要】:具体步骤如下:第一步百度搜索【密码帝官网】,第二步点击“立即开始”,在用户中心上传文件即可。不用下载软件,手机电脑都可以用。…

Pytorch实战教程(一)-神经网络与模型训练

0. 前言 人工神经网络 (Artificial Neural Network, ANN) 是一种监督学习算法,其灵感来自人类大脑的运作方式。类似于人脑中神经元连接和激活的方式,神经网络接受输入,通过某些函数在网络中进行传递,导致某些后续神经元被激活,从而产生输出。函数越复杂,网络对于输入的数…

云架构师学习------腾讯云通识-存储与数据库

云架构师学习------腾讯云通识-存储与数据库 云架构师学习------腾讯云通识-存储与数据库存储基础存储服务对象存储-COS产品概述功能概览产品优势 云硬盘-CBS产品概述产品功能产品优势云硬盘类型 文件存储-CFS产品概述产品功能产品优势文件存储类型及性能规格存储类型性能与规格…

图论09-桥和割点

文章目录 1 寻找桥的算法2 桥的代码实现3 寻找割点的算法4 割点的代码实现 1 寻找桥的算法 2 桥的代码实现 package Chapt06_Bridge;import java.util.ArrayList;public class FindBridges {private Graph G;private boolean[] visited;//ord数组记录访问的顺序private int or…

51单片机PCF8591数字电压表数码管显示设计( proteus仿真+程序+设计报告+讲解视频)

PCF8591数字电压表数码管显示 1.主要功能:讲解视频:2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单&&下载链接资料下载链接(可点击): 51单片机PCF8591数字电压表数码管设计( proteus仿真程序设计报告讲解视…