二叉树链式结构遍历(指针、递归)

news2024/12/23 22:41:03

当二叉树不使用数组实现,而是使用链式结构,用指针将节点相连时,

二叉树便会衍生出很多问题,如前序遍历、中序遍历、后序遍历、层序遍历。

下面我将用递归的方法完成二叉树的遍历。

但在这之前,我们还得构造链式结构的二叉树。

一、二叉树的链式结构

我们用结构体作为二叉树的节点,在结构体中设置左节点指针和右节点指针,以便连接下一个二叉树节点。

typedef int BTDataType;//二叉树数据类型为int
typedef struct BinaryTreeNode
{
//节点储存的数据
	BTDataType data;
//此节点下连接的左节点
	struct BinaryTreeNode* left;
//此节点下连接的又节点
	struct BinaryTreeNode* right;
}BTNode;//将此结构体命名为BTNode

然后让我们建立二叉树

//创建节点
BTNode* buyNode(int x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL) {
		perror("malloc fail");
		return 0;
	}
	node->data = x;
	node->left = NULL;
	node->right = NULL;
}

//将节点连接成二叉树
BTNode* CreateBinaryTree()
{
	BTNode* node1 = buyNode(1);
	BTNode* node2 = buyNode(2);
	BTNode* node3 = buyNode(3);
	BTNode* node4 = buyNode(4);
	BTNode* node5 = buyNode(5);
	BTNode* node6 = buyNode(6);
	BTNode* node7 = buyNode(7);
	node1->left = node2;
	node1->right = node3;
	node2->left = node4;
	node2->right = node5;
	node3->left = node6;
	node3->right = node7;
//返回根节点
	return node1;
}

下面的遍历都将以这颗二叉树作为例子:

dfa87e03b5974bfb8e4a521ba2fd48b0.png

二、二叉树的前序遍历

我们先回顾一下二叉树的前序遍历是什么。

前序遍历:根→左子树→右子树

646927acfddf408b9e2dc453be88db7b.png

用递归实现前序遍历的代码很短。。

void PrevOrder(BTNode* root)
{
//根是空的就打印N,代表走到了最底下的结点
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	printf("%d ", root->data);//根
	PrevOrder(root->left);//左子树
	PrevOrder(root->right);//右子树

}

根结点传进PrevOrder函数,

若根节点不为空,就打印data;

接着先走根的左节点,再走根的右节点……

篇幅有限,只能给大家画一部分递归的过程。。

如果大家

c4b0ba8cfb8d4df193b3b04c906942c3.png

三、二叉树的中序遍历

中序遍历:左子树→根→右子树

7bdcd899f9e84f15bab25d683e0eee54.png

void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	
	InOrder(root->left);//左子树
	printf("%d ", root->data);//根
	InOrder(root->right);//右子树

}

四、二叉树的后序遍历

后序遍历:左子树→右子树→根

7bdcd899f9e84f15bab25d683e0eee54.png

void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->data);
}

 

 

 

 

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

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

相关文章

深入解析 Apache Ranger

一. 概述 1.什么是 Apache Ranger? Apache Ranger 是一个为大数据平台提供集中化安全管理的开源框架,专门用于确保 Hadoop 生态系统中的数据安全。Ranger 通过提供细粒度的访问控制和监控,帮助组织实现对数据的全面安全管理,确保…

第四天旅游线路预览——从换乘中心到观鱼台

第四天:从贾登峪到喀纳斯风景区入口,晚上住宿贾登峪; 换乘中心有4 路车,喀纳斯②号车,去观鱼台,路程时长约20分钟; 将上面的的行程安排进行动态展示,具体步骤见”Google earth stu…

7.Jmeter数据驱动(csv数据文件设置)+Jmeter数据库操作

一、Jmeter数据驱动 因为:工作中,有些公司一个接口就是一个吻用例,另外一些公司一个接口有几十个用例,就需要用到数据驱动。 特别注意:断言,如果有共同字段,那么就用json断言,如果没…

文档管理系统Mayan EDMS的安装

今天台风 “贝碧嘉” 在上海登陆,这名字起的那叫一个绝,听起来像是 卑鄙家, 说的就是这台风 卑鄙到家了 什么是 EDMS? EDMS 代表电子文档管理系统,它是 DMS 的更现代版本。DMS 是文档管理系统。一种用于存储、排序和分…

二叉树的前中后序遍历(非递归迭代实现)

1.二叉树的前序遍历 1.1 思路分析 前序遍历的顺序是根-左子树-右子树,所以首先从根节点开始,顺着访问左子树:1、2、4。此时,还剩下节点1、节点2、节点3的右子树没有访问。后面倒着访问节点1、2、4的右子树就行了。所以非递归的前…

解决跨境电商平台账号无法访问的常见问题

跨境电商的迅猛发展,越来越多的卖家选择在全球各大电商平台如亚马逊、eBay等进行商品销售。然而,在实际运营过程中,卖家经常会遇到账号无法访问、应用打不开等问题,导致业务受阻。本文将针对这些问题进行详细分析,并提…

【医疗影像】THE BEER-LAMBERT LAW

吸光度 A l o g 10 ( I 0 I ) A log_{10}(\frac{I_0} I) Alog10​(II0​​) 如果您了解光谱仪如何工作,您就会知道它使一系列波长的光穿过物质溶液(样品cell),同样地,也会穿过溶剂(参考cell) …

信息安全工程师(5)域名与域名解析

一、域名 1. 定义与功能 域名(Domain Name)是互联网上用于标识网站或服务器地址的名称,由一串由点分隔的字符组成,如“example.com”。域名的主要功能是提供一种便于记忆和输入的地址形式,以代替难以记忆的IP地址。域名…

【Axure原型】B端系统登录注册页设计成这样,就不用跟小孩一桌了

前言 在B端后台中,登录注册页这个东西,因为感觉很简单,所以经常不被产品经理们重视。但是登录注册页作为一个后台系统的门面,直接影响用户第一印象,又是非常重要的存在。 登录注册页的价值 B端系统登录注册页是用户…

浸没边界法空间精度相关的论文的阅读笔记

Convergence proof of the velocity field for a stokes flow immersed boundary method https://doi.org/10.1002/cpa.20233 研究对象的选取 他这里为什么能够选取一个周期性边界的流场啊?为什么不是狄利克雷边界或者诺伊曼边界? 方形流场的边界值 …

【Linux】精通GDB:打造你的Linux调试超能力

🌈 个人主页:Zfox_ 🔥 系列专栏:C从入门到精通 目录 一: 🔥 什么是GDB / CGDB 二: 🔥 CGDB的安装 🍊 Linux-centos 三: 🔥 cgdb的使用背景 &#…

vmware,centos8(虚拟机) 的安装

安装vmware 点击下方网址 虚拟机安装地址https://www1.msc23.cn/vm/?bd_vid8829610582362807097选择VMware17 打开文件所在地,双击安装 同意条款 选择安装位置 不将VMware配置到环境变量path 不检查更新,不加入客户体验 创建桌面快捷方式 开始安装 安装完成…

47.面向对象综合训练-汽车

//题目需求:定义数组存储3个汽车对象 //汽车的属性:品牌,价格,颜色 //创建三个汽车对象,数据通过键盘录入而来,并把数据存入到数组当中 1.标准的JavaBean类 public class Car {private String brand;//品…

基于yolov8的谢韦尔钢材缺陷检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的谢韦尔钢材缺陷检测系统,充分利用了YOLOv8算法的高效性和准确性,为钢材表面缺陷检测提供了先进的解决方案。该系统通过深度学习技术,特别是YOLOv8这一实时目标检测算法,能够快速、准确地识别钢材表面的…

【Linux进程】Linux Shell编程实战:构建简易脚本示例与技巧详解

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:Linux “ 登神长阶 ” 🤡往期回顾🤡:暂无 🌹🌹期待您的关注 🌹🌹 ❀Linux进程 📒1. 获取输入&…

《Nginx核心技术》第17章:使用自签CA配置HTTPS加密反向代理访问

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

事务方法中存在远程调用

1. 背景 在实现下单的方法中,首先通过远程调用查询了地址簿信息和服务信息等,然后将这些信息和前端传入的预约时间、服务项等信息封装到order实体类,然后调用Mybatis-Plus提供的ServiceImpl类的save方法,向数据库表中插入数据。 …

基于51单片机的220V交流数字电流表proteus仿真

地址:https://pan.baidu.com/s/1QmpPLvDTuW7QG7P-JCLPPg 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectron…

直流无刷电机霍尔线序自学习解释

直流无刷电机霍尔线序自学习 步骤详解 1. 初始连接 连接电机的三相线:A、B、C。连接霍尔传感器线:HA、HB、HC。 2. 输入电压组合与霍尔信号记录 电机的电压输入组合和霍尔信号记录是电机控制系统中至关重要的一部分,它们决定了电机的运转…

CODESYS标准化编程之输入输出映射

在介绍输入输出映射之前大家需要了解开关量防抖滤波功能块,相关链接如下: 开关量防抖滤波器(梯形图和SCL源代码)_开关量输入滤波程序-CSDN博客文章浏览阅读724次。本文介绍了开关量防抖滤波器的原理和应用,包括梯形图和SCL源代码的实现。通过防抖滤波功能块,可以有效滤除低…