二叉树链式结构基础

news2024/11/17 23:42:47

一、前中后序遍历

1、前序遍历:前序遍历是采用 根 - 左子树 - 右子树 的顺序遍历二叉树。

也就是把整棵树分为一个个子问题,每个结点都可以看作 根、左子树、右子树 三个部分

 (左右子树可以为空,就是单节点,根为空就表示探索完成,返回)。

前序遍历就是先保存根,然后向左探索,遇到空回来后向右探索。

当所有结点的 根、左子树、右子树 都探索完成,整棵树也就探索完成了。 

 代码如下:

//前序遍历
void BinaryTreePrevOrder(BTNode* root)
{
	if (root == nullptr)
		return;

	printf("%c ", root->_data);

	BinaryTreePrevOrder(root->_left);
	BinaryTreePrevOrder(root->_right);
}

可以根据图来看 

2、中序遍历:中序遍历是采用 左子树 - 根 - 右子树 的顺序遍历二叉树。

与前序遍历类似,每个结点都可以看作 根、左子树、右子树 三个部分

不同的是中序遍历是先向左探索,等到为空返回时,再记录当前结点,最后向右探索

代码如下: 

// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root)
{
	if (root == nullptr)
		return;

	BinaryTreePrevOrder(root->_left);

	printf("%c ", root->_data);

	BinaryTreePrevOrder(root->_right);
}

 

3、后序遍历:后序遍历是采用 左子树 - 右子树 - 根 的顺序遍历二叉树。 

与前序和中序类似,后序是先向左探索,递归返回后向右探索,最后记录根

代码如下:

// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root)
{
	if (root == nullptr)
		return;

	BinaryTreePrevOrder(root->_left);
	BinaryTreePrevOrder(root->_right);

	printf("%c ", root->_data);
}

 

二、层序遍历

层序遍历:和名字一样,就是一层一层遍历,如上图示例,层序遍历就是

                                                                                              1 2 3 4 5 6 7 8 9

操作方法:先用一个队列保存根结点,然后在出根节点的时候把它的左右不为空的孩子入队列,然后重复先出再入操作。每个父亲结点会在走之前会把自己的孩子都拉进队列(也就是当一层结点遍历完成后,其二层结点已经全部在队列里面了),所以在遍历过程中栈不会为空,栈为空就代表所有结点都遍历完成,结束循环。

代码如下: 

// 层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{
	queue<BTNode*> q;//队列
	q.push(root);//先入根节点
	while (!q.empty())//为空结束
	{
		BTNode* tmp = q.front();//取队头数据
		printf("%c ", tmp->_data);
		q.pop();//出
		if(tmp->_left)//把它的非空孩子拉进队列
			q.push(tmp->_left);
		if(tmp->_right)
			q.push(tmp->_right);
	}
}

三、计算结点个数

分治思想,把整棵树分为 根 - 左子树 - 右子树 ,结点个数就等于 左子树 + 右子树 + 1.

代码如下 :

// 二叉树节点个数
int BinaryTreeSize(BTNode* root)
{
	if (root == nullptr)
		return 0;
	int leftHeight = BinaryTreeSize(root->_left);
	int rightHeight = BinaryTreeSize(root->_right);

	return leftHeight + rightHeight + 1;
}

四、查找值为x的结点

查找值为x的结点,遍历查找,前中后序都可以,找到返回即可。

// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	if (root == nullptr)
		return nullptr;
	if (root->_data == x)
		return root;

	BTNode* ret1 = BinaryTreeFind(root->_left, x);
	if (ret1)//如果找到了直接返回,没找到去右边找
		return ret1;
	return BinaryTreeFind(root->_right, x);
}

 

五、销毁二叉树

销毁二叉树:就是将二叉树的所有结点都free掉,也要遍历二叉树。

那该用前序中序还是后序呢?

前序是先将自己干掉,把自己干掉后就找不到左右孩子了,所以不行

中序是先把左子树干掉,再把自己干掉,自己没了就找不到右孩子了,也不行

后序是先把左右子树干掉,在释放自己,刚好符合我们的要求,所以就用后续

代码如下: 

// 二叉树销毁
void BinaryTreeDestory(BTNode** root)//传二级是为了把root置空
{
	if (*root == nullptr)
		return;

	BinaryTreeDestory(&(*root)->_left);
	BinaryTreeDestory(&(*root)->_right);
	free(*root);
	*root = nullptr;
}

感谢大家观看!!!

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

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

相关文章

自动化测试需知的4项测试工具!

一般来说学自动化会建议大家先学selenium&#xff0c;因为最早的时候&#xff0c;自动化就代表selenium&#xff0c;进入测试行业就开始做接口测试&#xff0c;而且现在基本每个公司都需要接口测试。今天就和大家聊一下接口测试的工具。 一、Robot Framework 机器人框架。之所…

利用证书给pdf文件添加数字签名

文章目录 给pdf文件签名文件准备构建印章获取证书方法一 阿里云申请证书方法二 自建证书 利用证书给pdf签名在指定位置签名在指定坐标签名在指定签名域签名 给pdf文件签名 如何给pdf文件签名&#xff0c;这样pdf文件就具有不可修改性&#xff0c;具有鉴权、完整性、不可抵赖。…

【操作系统笔记】内存寻址

物理寻址 主存&#xff08;内存&#xff09; 计算机主存也可以称为物理内存&#xff0c;内存可以看成由若干个连续字节大小的单元组成的数组每个字节都有一个唯一的物理地址&#xff08;Physical Address&#xff09;CPU访问内存前&#xff0c;先拿到内存地址&#xff0c;然后…

通讯网关软件005——利用CommGate X2OPC实现OPC客户端访问MS SQL服务器

本文推荐利用CommGate X2OPC实现OPC客户端访问MS SQL服务器获取数据。CommGate X2OPC是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;上位机通过OPC Client软件来获取MS SQL数据库的数据。 …

Qt扩展-KDDockWidgets 简介及配置

Qt扩展-KDDockWidgets 简介及配置] 一、概述二、编译 KDDockWidgets 库1. Cmake Gui 中选择源文件和编译后的路径2. 点击Config&#xff0c;配置好编译器3. 点击Generate4. 在存放编译的文件夹输入如下命令开始编译 三、qmake 配置 一、概述 kdockwidgets是一个由KDAB组织编写…

基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境Pycharm 环境Scikit-learnt 模块实现1. 数据预处理2. 客流预测3. 百度地图API调用4. GUI界面设计1&#xff09;手绘地图导入2&#xff09;下拉菜单设计3&#xff09;复选框设计4&#xff09;最短路径结果输出界面…

睿趣科技:抖音开一家网店大概什么时候回本

随着移动互联网的迅猛发展&#xff0c;社交媒体平台如抖音成为了商家推广产品和服务的热门渠道之一。许多人都希望能够通过在抖音上宣传自己的产品&#xff0c;甚至考虑开一家网店&#xff0c;但回本的时间是一个关键问题。本文将探讨抖音开一家网店大概什么时候回本的问题。 首…

calloc

目录 前提须知&#xff1a; 函数介绍&#xff1a; 原型如下&#xff1a; 申请空间&#xff1a; 判断是否申请成功&#xff1a; 释放空间&#xff1a; calloc与malloc的相同之处与不同之处&#xff1a; 相同之处&#xff1a; 不同之处&#xff1a; 举例&#xff1a; ca…

API接口知识小结及电商数据平台商品详情接口请求案例

应用程序接口API&#xff08;Application Programming Interface&#xff09;&#xff0c;是提供特定业务输出能力、连接不同系统的一种约定。这里包括外部系统与提供服务的系统&#xff08;中后台系统&#xff09;或后台不同系统之间的交互点。包括外部接口、内部接口&#xf…

无涯教程-JavaScript - SUMXMY2函数

描述 SUMXMY2函数返回两个数组中相应值的差的平方和。 语法 SUMXMY2 (array_x, array_y)争论 Argument描述Required/OptionalArray_xThe first array or range of values.RequiredArray_yThe second array or range of values.Required Notes 参数应为数字或名称,数组或包…

Vite前端构建工具详解

Vite前端构建工具 Vite 是一款新兴的前端构建工具&#xff0c;它的出现带来了前端开发体验的革命性变化。本文将介绍 Vite 的基本概念和核心特性&#xff0c;并通过代码实例来演示其强大功能。 什么是 Vite&#xff1f; Vite 是由 Evan You&#xff08;Vue.js 的创始人&#x…

掌握进度管理基本指南,保证项目不延期

项目管理中的进度管理是规划、制定、控制和监控项目时间表的过程&#xff0c;确保任务和活动按时完成。 假设你是一名项目经理&#xff0c;带着团队组织一场备受瞩目的音乐节。精确的时间安排是关键。你需要确保演出者准时到达并按计划表演&#xff0c;所有供应商都准备就绪&a…

「干货」洁净室悬浮粒子计数器全部常见型号参数汇总

我们的人体工程学设计轻巧的Lighthouse手持式3016-IAQ是市场上先进的手持式粒子计数器&#xff0c;其质量浓度模式的密度约为μg/ m3。Lighthouse手持式粒子计数器最多可提供6个粒径同时计数的通道&#xff0c;可在快速&#xff0c;易于阅读的彩色触摸屏上显示累积和差分粒子计…

推荐一个可以采集众多国内外电商网站数据的工具

淘宝API 接入地址 item_get 获得淘宝商品详情item_get_pro 获得淘宝商品详情高级版item_review 获得淘宝商品评论item_fee 获得淘宝商品快递费用item_password 获得淘口令真实urlitem_list_updown 批量获得淘宝商品上下架时间seller_info 获得淘宝店铺详情item_search 按关键…

做题杂记222

文章目录 题1题2题3题4 一些较简单的题目。里面有些小点&#xff0c;稍不留意跑起来也挺费时。 题1 leak 题目描述&#xff1a; #!/usr/bin/env python # -*- coding: utf-8 -*- from Crypto.Util.number import * from secret import FLAGm bytes_to_long(FLAG)def getpq(n…

新消费降温,良品铺子还能走多远?

如果时间倒退到多年前&#xff0c;杨红春应该不会料到现在良品铺子的境遇。 从2006年创立至今&#xff0c;前半段良品铺子经历了品牌升级&#xff0c;从线下发展到平台电商、社交电商&#xff0c;做APP客户端进行全渠道的营销&#xff0c;把一家曾入不敷出的小店&#xff0c;养…

echarts 轴文字内容太长导致显示不全解决方案

情况&#xff1a;Y轴内容是文字&#xff0c;内容太长可能会系那是不全。调整grid会导致短数据前的留白过于多。 解决方案&#xff1a; 方法一&#xff1a; 首先可以配置grid自适应 &#xff0c; containLabel 属性设置true &#xff08;这常用于『防止标签溢出』的场景&…

51单片机光照强度检测自动路灯开关仿真( proteus仿真+程序+报告+讲解视频)

51单片机光照强度检测自动路灯开关仿真( proteus仿真程序报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0052 讲解视频 基于51单片机的光照检测自动路灯控制仿真设计( proteus仿…

42V转5V芯片——高效率、宽压输入范围和强大输出能力

42V转5V芯片——高效率、宽压输入范围和强大输出能力 摘要&#xff1a; 42V转5V芯片是一种电源管理解决方案&#xff0c;可以将高达42V的输入电压转换为稳定的5V输出电压。该芯片以其高效率、宽压输入范围和强大的输出能力而备受关注。它具有93%的转换效率&#xff0c;能够在广…

学Python的漫画漫步进阶 -- 第十五步.访问数据库

学Python的漫画漫步进阶 -- 第十五步.访问数据库 十五、访问数据库15.1 SQLite数据库15.1.1 SQLite数据类型15.1.2 Python数据类型与SQLite数据类型的映射15.1.3 使用GUI管理工具管理SQLite数据库 15.2 数据库编程的基本操作过程15.3 sqlite3模块API15.3.1 数据库连接对象Conne…