[数据结构基础]链式二叉树及其前序、中序和后序遍历

news2024/12/28 3:24:06

一. 链式二叉树的结构和实现

1.1 链式二叉树的结构

链式二叉树,即使用链来表示一颗二叉树。链式二叉树的存储又可分为二叉链和三叉链,其中二叉链存储节点数据、指向左子节点的指针和指向右子节点的指针,三叉链相对于二叉链多存储指向父亲节点的指针,二叉链和三叉链的结构见图1.1。

1.2 链式二叉树的实现

链式二叉树的实现与链表节点的实现类似,要定义一个结构体,其成员包括存储的数据、指向左孩子节点的指针和指向右孩子节点的指针,如果是三叉链要多包含一个指向父亲节点的指针。

typedef int BTDataType;   //重定义节点数据类型

//采用二叉链表定义
typedef struct BinaryTreeNode
{
	BTDataType data;   //节点数据
	struct BinaryTreeNode* left;  //指向左孩子节点的指针
	struct BinaryTreeNode* right; //指向右孩子节点的指针
};

//采用三叉链表定义
typedef struct BinaryTreeNode
{
	BTDataType data;   //节点数据
	struct BinaryTreeNode* parent;  //指向父亲节点的指针 
	struct BinaryTreeNode* left;    //指向左孩子节点的指针
	struct BinaryTreeNode* right;   //指向右孩子节点的指针
};

1.3 链式二叉树节点的创建

采用BuyNode函数,创建链式二叉树节点(这里以二叉链表为例)。BuyNode函数有一个参数x,为节点要存储的数据,函数进行的操作有:为节点动态开辟内存空间、将x存入节点空间、将指向左孩子节点的指针和指向右孩子节点的指针均置为NULL。

BuyNode函数代码:

BTNode* BuyNode(BTDataType x)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	assert(newnode);

	newnode->data = x;
	newnode->left = newnode->right = NULL;

	return newnode;
}

二.  二叉树的前序、中序和后序遍历

2.1 前序、中序和后序遍历的概念

  1. 前序遍历(Preorder Traversal 亦称先序遍历):在遍历左右子树之前访问根节点。具体遍历顺序为:根节点 -> 左子树 -> 右子树。
  2. 中序遍历(Inorder Traversal):访问根节点发生在遍历左右子树之间。具体遍历顺序为:左子树 -> 根节点 -> 右子树。
  3. 后序遍历(Postorder Traversal):在遍历左右子树之后访问根节点。具体遍历顺序为:左子树 -> 右子树 -> 根节点。
图2.1  二叉树

如图1.2所示的二叉树(\varphi表示空),其前序、中序、后序遍历的访问顺序分别为:

  • 前序遍历:1 -> 2 -> 3 -> NULL -> 4 -> 5 -> 6
  • 中序遍历:3 -> 2 -> NULL -> 1 -> 5 -> 4 -> 6
  • 后序遍历:3 -> NULL -> 2 -> 5 -> 6 -> 4 -> 1
图2.2  图2.1中二叉树的前序、中序、后续遍历图解

 

2.2 链式二叉树的前序、中序、后序遍历的函数实现

无论是对链式二叉树进行前序、中序还是后序遍历,都是采用递归的思想来实现的。

2.2.1 前序遍历函数PreOrder

向函数传入指向根节点的指针作为参数,判断根节点是否为空,如果为空,则函数返回。如果不为空,则先打印该节点的数据,然后先后将指向左孩子节点的指针和指向右孩子节点的指针作为参数传入函数PreOrder进行递归调用即可。

PreOrder函数代码:

void PreOrder(BTNode* root)
{
	if (NULL == root)
	{
		return;
	}

	printf("%d ", root->data);
	PreOrder(root->left);
	PreOrder(root->right);
}

2.2.2 中序遍历函数InOrder

向函数传入指向根节点的指针作为参数,判断根节点是否为空,如果为空,则函数返回。如果不为空,则先将指向左孩子节点的指针作为参数传给函数InOrder递归调用,再打印当前节点数据,最后将指向右孩子节点的指针作为参数传给函数InOrder递归调用即可。

InOrder函数代码:

void InOrder(BTNode* root)
{
	if (NULL == root)
	{
		return;
	}

	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);
}

2.2.3 后序遍历函数PostOrder

向函数传入指向根节点的指针作为参数,判断根节点是否为空,如果为空,则函数返回。如果不为空,则首先先后将指向左孩子节点的指针和指向右孩子节点的指针作为传入函数进行递归调用,然后打印节点数据即可。

PostOrder函数代码:

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

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

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

相关文章

一种基于肌电信号运动起点、波峰、终点实时自动检测的方法

一种基于肌电信号运动起点、波峰、终点实时自动检测的方法 (⊙o⊙)…,这篇是我写收费文章的第一篇。咱也尝试下知识付费,哈哈。 先看下效果,在给定理想正弦波的情况下,可以准确识别到正弦波的起点、波峰和终点。机器实拍图如下。 因为我的实际环境没有专利里面那么复杂,所…

Android 蓝牙开发——基础开发(三)

蓝牙开发这部分主要以 APP 端调用功能接口为开始&#xff0c;到 Framework 端的调用流程&#xff0c;最后到调用状态机结束&#xff0c;不涉及蓝牙协议栈的开发分析。 一、BluetoothAdapter 1、APP获取适配器 蓝牙权限 <mainifest><uses-permission android:name&…

3.ESP32-S2/S3 USB 挂载SPI-SD,当作U盘使用,无线U盘

使用的 IDF_4.4 C语言开发 1.ESP32-S2/S3 USB烧录 输出日志 2.ESP32-S2/S3 USB 挂载内部Flash&#xff0c;当作U盘使用&#xff0c;无线U盘 3.ESP32-S2/S3 USB 挂载SPI-SD&#xff0c;当作U盘使用&#xff0c;无线U盘 目录1.打开 usb_msc_wireless_disk 工程 Confinguration2.…

数学建模-数学规划(Matlab)

目录 一、线性规划求解 二、非线性规划问题 三、整数规划&#xff08;包括0-1规划&#xff09; 四、最大最小化模型 五、多目标规划模型 注意&#xff1a;代码文件仅供参考&#xff0c;一定不要直接用于自己的数模论文中国赛对于论文的查重要求非常严格&#xff0c;代码雷同…

微服务Spring Boot 整合 Redis 实现 UV 数据统计

文章目录⛄引言一、HyperLoglog基础用法⛅HyperLoglog 基本语法、命令⚡HyperLoglog 命令完成功能实现二、UV统计 测试百万数据的统计☁️什么是UV统计⚡使用SpringBoot单元测试进行测试百万数据统计⛵小结⛄引言 本文参考黑马 点评项目 在各个项目中&#xff0c;我们都可能需…

DaVinci:限定器 - HSL

调色页面&#xff1a;限定器Color&#xff1a;Qualifier限定器 - HSL Qualifier - HSL根据色相、饱和度和亮度等来选择画面上的对应区域&#xff0c;从而将二级调色与修饰限制在一定的范围。选择范围Selection Range拾取器Picker在检视器画面上按住并拖动&#xff0c;可以选择相…

Linux FHS结构

FHS是Filesystem Hierarchy Standard&#xff08;文件系统层次化标准&#xff09;的缩写&#xff0c;多数Linux版本采用这种文件组织形式&#xff0c;类似于Windows操作系统中c盘的文件目录&#xff0c;FHS采用树形结构组织文件。FHS定义了系统中每个区域的用途、所需要的最小构…

格式化输出

1、golang不同输出语句的区别&#xff1a; 特点PrintPrintlnPrintf输出内容到控制台&#xff08;终端输出&#xff09;SprintSprintlnSprintf输出内容为字符串FprintFprintlnFprintf输出内容到文件特点 输出内容不会换行。 不能格式化字符串。 输出内容换行,。 不能格式化字符…

【C语言进阶】枚举与联合体

目录一&#xff1a;枚举1.1&#xff1a;枚举类型的定义&#xff1a;1.1&#xff1a;枚举的优点&#xff1a;1.2&#xff1a;枚举的使用&#xff1a;二&#xff1a;联合&#xff08;共用体&#xff09;2.1&#xff1a;联合类型的定义&#xff1a;2.2&#xff1a;联合类型的特点&…

cin、cin.getline(arr, size)、getline(cin, str)

一、cin使用空白&#xff08;空格、制表符、换行符&#xff09;来确定字符串的截止位置 注意下方这段代码 使用cin来接收姓名和甜点名&#xff0c;当我的名字长度大于一个单词长度时&#xff0c;cin直接按空格进行接收&#xff0c;将我输入的xiao接收到name中&#xff0c;wei接…

swiftUI coreml deeplabv3去除背景

现在手机的性能越来越好&#xff0c;好多深度学习的框架都能能够跑在手机上。因此就集成一下一个官方的深度学习model试一下。 其他的框架生成的模型都能通过相应的工具转换成mlmodel用&#xff0c;转换也比较简单。 下面以替换图像去背景为例&#xff0c;不过官方模型这个效果…

概论_第3章_二维随机变量__边缘概率密度

边缘概率密度是二维随机变量中的重点内容&#xff0c; 经常作为一个重要的考点&#xff0c; 必须掌握。一 定义对二维随机变量(X, Y) ,分量X, 或者Y的概率密度称为 (X, Y)的边缘概率密度&#xff0c;简称边缘密度&#xff0c;记为 或者 。边缘密度 或者 可由 二维随机变量的密…

什么是pod(容器组)

pod&#xff08;容器组&#xff09; 术语中英文对照&#xff1a; 英文全称英文缩写中文翻译PodPod容器组ContainerContainer容器ControllerController控制器 什么是 Pod 容器组&#xff1f; Pod&#xff08;容器组&#xff09;是 Kubernetes 中最小的可部署单元。一个 Pod&a…

基于FPGA的UDP 通信(六)

引言 前文链接&#xff1a; 基于FPGA的UDP 通信&#xff08;一&#xff09; 基于FPGA的UDP 通信&#xff08;二&#xff09; 基于FPGA的UDP 通信&#xff08;三&#xff09; 基于FPGA的UDP 通信&#xff08;四&#xff09; 基于FPGA的UDP 通信&#xff08;五&#xff09;…

【Spring6源码・AOP】AOP源码解析

上一篇《【Spring6源码・AOP】代理对象的创建》&#xff0c;我们知道了代理是如何创建的&#xff0c;那么它又是如何工作的呢&#xff1f; 创建完代理对象之后&#xff0c;最终&#xff0c;会真正的执行我们的目标方法&#xff0c;但是步入该方法&#xff0c;会进入cglib代理类…

ET框架关于opCode的理解

因为所有的网络消息在发送时候格式都是这样 对于用Protobuf定义的每一消息类型class&#xff0c;都需要定义一个对应消息头code在发送的时候&#xff0c;先将消息体进行序列化&#xff0c;再将code进行序列化&#xff0c;进行组装发送 //这个代码没有进行过优化&#xff0c;会产…

大衣哥给儿媳买回来烟花,是准备加入河南炮击山东大战吗

自从取得抗疫阶段性胜利后&#xff0c;国人就再也难以按捺激动的心情&#xff0c;都想通过放烟花以示庆祝。河南山东属于搭界的两个省&#xff0c;最近就因为放烟花&#xff0c;闹出来不小的笑话&#xff0c;有人甚至戏称炮击事件。 事情的起因是这样的&#xff0c;河南因为地处…

maven的build节点配置

虽然一直在使用maven&#xff0c;但是对于maven的配置还没有深入的了解过。本文以build节点为切入点&#xff0c;主要解释相关maven打包使用到的一些基础配置。 文章目录build节点常用插件spring-boot-maven-pluginmaven-jar-pluginmaven-dependency-plugin注意事项build节点 …

基于javaweb的会议管理系统源码+数据库,javaEE会议管理系统源码

guihaiyidao_git 介绍 javaEE工程 普通的javaEE工程&#xff0c;用idea打开工程即可运行 服务器用的是Tomcat 8.5.722 数据库用的Oracle xe版 数据库可视化工具使用的是PLSQL 相关软件 需要可从百度网盘中获取 链接&#xff1a;https://pan.baidu.com/s/1ZrmfsvQEA4dIP0GF_p…

CSS 布局 - 水平 垂直对齐

CSS 布局 - 水平 & 垂直对齐 那么怎样设置居中对齐呢? 我们可以用margin: auto来设置水平居中对其元素。auto可以防止 元素的宽高溢出&#xff0c;而且也可以平均分配两边的空白。 举例说明: .center {padding: 23px;border: 5px solid red;width: 41%;margin: auto; }那…