【数据结构之树】初阶数据结构之树的实现及其各种方式(上)

news2024/11/25 20:27:23

文章目录

  • 😏专栏导读
  • 🤖文章导读
  • 🙀树的预备知识
  • 🙀二叉树
    • 😳树的代码实现及其各类讲解
      • 🌲树的结构体初始化
  • 总结


😏专栏导读

👻作者简介:M malloc,致力于成为嵌入式大牛的男人
👻专栏简介:本文收录于 初阶数据结构,本专栏主要内容讲述了初阶的数据结构,如顺序表,链表,栈,队列等等,专为小白打造的文章专栏。
👻相关专栏推荐:LeetCode刷题集,C语言每日一题。


🤖文章导读

本篇文章我将详细的讲解关于树的知识点
在这里插入图片描述

🙀树的预备知识

前情介绍

对于大量的输入数据,链表的线性访问时间太慢,不宜使用。本片文章,我将讲述一种简单的数据结构,其大部分操作的时间复杂度为O(log n)。


树(tree)可以用几种方式定义。定义树的一种自然的方式是递归的方法。一棵树是一些节点的集合。这个集合可以是空集;若非空,则一棵树由称做根(root)的节点r以及0个或多个非空的(子)树 T1,T2,…,T 组成,这些子中每一的根都被来自根的一条有向的边(edge)所连接。

每一棵子树的根叫做根r的儿子(child)而r每一棵子的根的父亲(parent)。下图是显示用递归定义的典型的树。
在这里插入图片描述


从递归定义中我们发现,一棵树是 N 个节点和N - 1条边的集合,其中的一个节点叫做。存在 N -1条边的结论是由下面的事实得出的,每条边都将某个节点连接到它的父亲,而除去根节点外每一个节点都有一个父亲,如下图所示。

在这里插入图片描述
根节点,父亲节点,叶子节点,兄弟节点的详解

在上图的树中,节点A是根结点,节点F有一个父亲A并且有儿子K、L、M。每一个节点可以有任意多个儿子,也可以没有儿子也就是0个,但是只能有一个父亲。没有儿子的节点成为叶子节点(leaf);上图的叶子节点是B,C,H,I,P,Q,K,L,M和N。具有相同父亲的节点称为兄弟节点(sibing);因此K、L和M都是兄弟。


深度(depth)

首先,根的深度为0。在上图中E节点的深度为1,但是高为2,F的深度为1,高为1,该树的高为3,一个树的深度等于它的最深的树叶的深度;该深度总是等于这颗树的高。

🙀二叉树

二叉树(binary tree)是一棵树,其中每个节点都不能有多于两个的儿子。

在这里插入图片描述

二叉树的一个性质是平均二叉树的深度要比 N 小得多这个性质有时很重要。分析表明,这个平均深度为 O(/N).而对于特殊类型的二叉树,即二叉查找树(binary search tree)其深度的平均值是 O(log N)。不幸的是,正如下图中的例子所示,这个深度是可以大到 N -1的。

最坏情况的二叉树
在这里插入图片描述

😳树的代码实现及其各类讲解

🌲树的结构体初始化

树的结构

typedef int BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;

二叉树,顾名思义就是一个左子树,一个右子树,所以在这里我们定义了一个结构体类型的左子树和右子树。那么是不是还要存放数据呢?对的没错!所以还需要一个数据域data


手动创建一个树和开辟新节点

BTNode* BuyNode(BTDataType x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL)
	{
		perror("malloc fail");
		return NULL;
	}
	node->data = x;
	node->left = NULL;
	node->right = NULL;

	return node;
}

在上述代码中运用到了malloc这个库函数。这是在堆上动态开辟一块区域,把我们想要存入的值再放进去。

BTNode* CreatBinaryTree()
{
	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);
	BTNode* node8 = BuyNode(8);

	node1->left = node2;
	node1->right = node4;
	node2->left = node3;
	node4->left = node5;
	node4->right = node6;
	//node5->left = node7;
	node2->right = node7;
	node3->left = node8;

	return node1;
}

上述是手动进行指向节点,就是我们要对应着一幅图进行画它的指向,比如,node1的左边指向node2,就说明node2在node1的左边,然后node1的右边存放着node4,就说明node4的父亲是node1,也就是node4在node1的右边,也就是下图所示

在这里插入图片描述


树的前序遍历

其实在树的前序遍历过程中其实就是递归的过程。有一个很好的口诀,就是中左右,意思就是先遍历根节点,然后在遍历左子树,再从左子树递归下去,右子树也是样的操作。

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

在这里插入图片描述


树的中序遍历

那么中序遍历呢?中序遍历的口诀是左中右,就是先遍历左子树,在遍历根节点,右子树。就是这样的一系列的操作就行啦

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

在这里插入图片描述


树的后序遍历

后序遍历的自然也是有口诀的啦!我们的口诀是左右中,此时我们的根节点是最后才遍历的不知道你们发现没有!

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

总结

在本片文章中只是粗略的介绍了一下树的前中后序的遍历,其实代码的思路是很简单的就是几个递归的操作,大家多画画递归的展开图就能理解啦!那么这只是树的上篇。在树的下篇中,我将详细讲解怎么利用递归求出树的一系列操作等问题,我是爱你们的M malloc 我们下期再见!

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

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

相关文章

LinkNet分割模型搭建

原论文:LinkNet: Exploiting Encoder Representations for Efficient Semantic Segmentation 直接步入正题~~~ 一、LinkNet 1.decoder模块 class DecoderBlock(nn.Module):def __init__(self, in_channels, n_filters): #512, 256super(DecoderBlock, self).__in…

计算机毕业论文选题推荐|软件工程|信息管理|数据分析|系列二

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程|信息管理|数据分析|系列二 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 …

关于21电赛数字识别

这里我们只讲数字识别的代码。 关于模型的训练,这里就不多讲了,看我的这篇文章: K210学习篇(八)在MaixHub训练模型_ODF..的博客-CSDN博客 这里着重讲我们得到训练后的模型该怎么去修改以及和stm32单片机通信。 当我们把下载的模型解压后,就得到一些这些文件,我们只需…

EasyDSS视频直播点播平台如何修改登录密码与开启接口鉴权?

随着互联网的发展,网络安全问题也越来越受到重视。近期我们也对旗下所有的视频平台进行了技术升级,以增强平台的数据安全性,保障用户的信息安全。用户也可以通过以下指导步骤,对平台相关配置进行修改,提高保护等级。 1…

阻塞、挂起和睡眠

挂起(主动)和阻塞(被动) 本质:正在执行的进程/线程,由于某些原因主动或者被动的释放 CPU,暂停执行;挂起会将进程移出内存,阻塞的进程还在内存中;挂起时会释放…

CSDN发表文章的常用语法说明

CSDN常用语法说明 一、标题二、文本样式三、列表四、图片五、链接六、目录一级目录二级目录三级目录 七、表格八、注释九、自定义列表十、LaTeX 数学公式十一、插入甘特图十二、插入UML图十三、插入Mermaid流程图十五、插入Flowchart流程图十六、 插入类图十七、快捷键十八、脚…

汽车供应链专场对接会 | 8月25日大会同期活动

爱普搜汽车供应链对接会,是根据采购商的项目需求,有针对性地组织全国各地采购商与供应商,进行面对面交流与沟通,促成实质性交易。参会群体为汽车行业制造型企业、主机厂、Tier1/2。 供应商在参加对接会前已做足功课,现…

使用Linux Deploy搭建服务器(二)使用chroot容器安装linux发行版

一、先下载好软件 Linux Deploy(一)Linux Deploy简介与软件安装_吻等离子的博客-CSDN博客 二、搭建debian 首先手机要获取root权限 linux Deploy支持许多发行版linux,发行版建议选择Debian,这个版本最好装,Ubuntu …

提升互联网创业项目在搜索结果中的排名的SEO技巧

搜索引擎优化(SEO)技巧:提升互联网创业项目在搜索结果中的排 在当今竞争激烈的互联网创业领域,拥有一个高排名的搜索结果对于项目的成功至关重要。搜索引擎优化(SEO)是一种有效的策略,可以提高您的互联网创业项目在搜索…

RocketMQ 5.1.0 在java中的使用

版本&#xff1a; 当前测试版本&#xff1a;springBoot 2.3.9、 RocketMQ 5.1.0 Maven或Gradle RocketMQ的依赖项&#xff1a; <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>5…

国内开源框架(快速开发,避免重复造轮子)

若依开源框架&#xff08;最容易上手&#xff0c;轻巧简洁&#xff09; 若依开源框架是一款基于SpringBoot2.x和Vue.js的前后端分离的权限管理系统。它采用了前后端分离的架构&#xff0c;使得系统更加灵活、易扩展。同时&#xff0c;它还集成了多种常见的功能模块&#xff0c…

UEC++: 接口

1. 2. 3. 4.一般接口的源文件是不用写逻辑的&#xff0c;一般是在接口头文件中编写 5.被C类继承&#xff1a; 写完函数&#xff0c;千万不允许定义&#xff01;&#xff01;&#xff01; 添加标记宏 找到一个类&#xff1a;继承I开头的接口&#xff1a;引用头文件 错误重写&…

移 动 端

移动端 国内的UC和QQ&#xff0c;百度等手机浏览器都是根据 Webkit 修改过来的内核 兼容移动端主流浏览器 处理 webkit 内核浏览器即可 常见移动端屏幕尺寸 调式 Chrome DevTools&#xff08;谷歌浏览器&#xff09;的模拟手机调试搭建本地 web 服务器&#xff0c; 手机和服…

嵌入式开发--STM32用DMA+IDLE中断方式串口接收不定长数据

回顾 之前讲过用 利用IDLE空闲中断来接收不定长数据 &#xff0c;但是没有用到DMA&#xff0c;其实用DMA会更加的高效&#xff0c;MCU也可以腾出更多的性能去处理应该做的事情。 原理简介 IDLE顾名思义&#xff0c;就是空闲的意思&#xff0c;即当监测到串口空闲超过1个串口…

Java---第五章(类和对象,方法带参)

Java---第五章 一 类和对象类的由来&#xff1a;二者之间的关系this关键字&#xff1a;构造方法 二 方法带参构造方法带参&#xff1a;方法带参对象数组引用数据类型作为方法参数方法重载面向对象说明面向对象和面向过程的区别 一 类和对象 类的由来&#xff1a; 人们在日常生…

【HCIA】11.ACL与NAT地址转换

ACL 通过ACL可以实现对网络中报文流的精确识别和控制&#xff0c;达到控制网络访问行为、防止网络攻击和提高网络带宽利用率的目的。 ACL是由permit或deny语句组成的一系列有顺序的规则的集合&#xff1b;它通过匹配报文的相关字段实现对报文的分类。ACL是能够匹配一个IP数据包…

结合ChatGPT制作PPT

今天看到圈友的一个AI分享&#xff0c;然后自己本身需要做一个分享的PPT。刚好那着帖子实战一下。先说下整体感受。 优点&#xff1a;制作成本确实会比较低&#xff0c;很熟练的话大概就是1分钟一个都有可能。整体流程是先找个第三方PPT制作网站&#xff0c;看下支不支持文本转…

Unity游戏源码分享-Third Person Controller - Shooter Template v1.3.1

Unity游戏源码分享-Third Person Controller - Shooter Template v1.3.1 功能非常齐全 AI格斗 2.5D 完整工程地址&#xff1a;https://download.csdn.net/download/Highning0007/88057824

兴达易控modbus转profinet网关与流量变送器兼容转modbusTCP网口协议

本案例演示电磁流量计通过兴达易控modbus转profinet网关&#xff08;XD-MDPN100&#xff09;连接西门子1200PLC实现Profinet转ModbusTCP&#xff0c;协议网关MDPN100兼容转ModbusTCP网口协议&#xff0c;大大减少了对plc编程的工作 网络拓展图 打开博图&#xff0c;添加PLC并加…

django报错设置auth User

1.报错&#xff1a;auth.User.groups... auth.User.user_permissions... 我们的用户组、用户权限只能关联一个用户 &#xff0c;我们自己定义了一个用户表&#xff0c;系统还有一个用户表&#xff0c;这时候就会出问题。 解决办法&#xff1a; 让给我们自己定义的user替换系…