数据结构之-----二叉树

2023-09-15 19:56:23

目录

本章内容如下:

        1:树的相关概念与结构

        2:二叉树的概念与结构

        3:二叉树的链式结构与实现


        文章正式开始,让我们一起学习树吧!!

        

        一:树的概念

                树是一种非线性结构 ,与我们前面所学的顺序表与链表不同,数据元素的对应是1对多的关系,只有一个根结点,且除了根节点其它的结点有且仅有1个前驱结点(父结点)

                我们可以将一棵树看作由很多个结构相似子树组成,所以树是递归定义的。

              注意:在树形结构中子树不能出现相交,简单的来说就是一棵树中不能出现闭合的结构。

         1.1:树的相关概念

              节点的度:一个结点含有子树的个数称为该节点的度。

               叶结点或终端结点:度为0的结点,称为叶节点。

                非终端节点或分支结点:度不为0的结点。

                双亲结点或父节点:结点的前驱结点曾为它的父节点或双亲结点。

                兄弟结点:具有相同父节点的结点。

                树的度:树中最大节点的度称为树的度。

                节点的层次:从根开始定义起,根为第一层,子节点自增。

                树的高度:树中节点的最大层次。

                堂兄弟结点:双亲在同一层的结点。

                结点的祖先:从根到该节点所经分支上的所有节点。

                子孙:在某一棵树中,选定根节点之后所有的其它节点都是该节点的子孙。

                森林:由m(m>0)棵互不相交的树的集合称为森林。

                1.2:树的结构(表示)

                        

        

         

        我们应该如何来表示这棵树呢?

        因为我们不仅要保留节点的值,还需要保留结点与结点的关系。

        在实际中有许许多多的方法可以用来表示树的结构,我们来介绍一种非常牛逼的方法,叫做孩子兄弟法。

        

       

         比如我们想要表示上述的这棵树。

        我们定义一个结点:

                

struct TreeNode
{
	int val;
	struct TreeNode* FirstChild;
	struct TreeNode* brother;

};

        用图来表示---->

                 其实在我们电脑中经常会使用到树这个数据结构,比如我们的磁盘放置文件的结构就是这样的。还有在我们Linux系统上。

        

         二:二叉树相关概念与结构

                2.1:概念

                二叉树:由根节点与左右子树构成,且节点的度不超过2。

                任何二叉树都是由一下几种情况复合而成的->

                        

        对于任何一颗二叉树我们都可以将他看成三个部分:根左子树右子树,看成这样的结构的时候我们有利于采用分治的思想解决二叉树的有关问题。

                二叉树的子树有左右之分,不能跌倒它们的次序,所以二叉树是有序树。

        2.2特殊的二叉树

        在二叉树中有两种特殊的树:满二叉树与完全二叉树

        满二叉树:一个二叉树中,每一层的结点的个数都达到了最大值,假设高度为h,那么我们可以通过推理可以得出结点的个数为:2^h-1

        如图:

        

        

        完全二叉树:假设高度为h,在一棵二叉树中,前h-1层是满二叉树,且第h层结点是连续的

        它的结点的范围为:[2^(h-1),2^h-1].

        2.3:二叉树的性质

        规定根节点的层数为1

                1:一棵非空二叉树的第i层最多有2^(h-1)个结点

                2:深度为h的二叉树,最多有2^h-1个结点。

                3:对于任何一颗二叉树度为0结点的个数等于度为2结点的个数加1:n0=n2+1;

                4:具有n个结点的满二叉树的深度为:h=log(n+1).

    三:二叉树的链式结构

        这里我们采用简单一点的二叉树结构,我们手动的创建二叉树

        代码如下:

定义结构的代码:

        

typedef int TreeDataType;
typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
	TreeDataType val;
}TRNode;

	TRNode* node1=BuyTreeNode(1);
	TRNode* node2= BuyTreeNode(2);
	TRNode* node3 = BuyTreeNode(3);
	TRNode* node4 = BuyTreeNode(4);
	TRNode* node5 = BuyTreeNode(5);
	TRNode* node6 = BuyTreeNode(6);

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

        3.1二叉树的遍历

        二叉树的遍历是我们学习二叉树最简单的操作,有三种遍历方式且我们遍历一个结点只操作一次。

        前序遍历:访问的方式为:根 左子树 右子树

          代码如下:

        

void prevOrder(TRNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;

	}
	printf("%d ", root->val);
	prevOrder(root->left);
	prevOrder(root->right);
}

        接下来我们采用递归展开图的方式来详细讲解这段代码的意思。

        

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

        代码:

        

void InOrder(TRNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

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


}

    这里就不详细讲解了。

        后序:左子树 右子树 根

        

void postOrder(TRNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	postOrder(root->left);
	postOrder(root ->right);
	printf("%d ", root->val);
}

                本章分享完毕,感谢大家的观看。

        

更多推荐

单元测试 —— JUnit 5 参数化测试

JUnit5参数化测试目录设置我们的第一个参数化测试参数来源@ValueSource@NullSource&@EmptySource@MethodSource@CsvSource@CsvFileSource@EnumSource@ArgumentsSource参数转换参数聚合奖励总结如果您正在阅读这篇文章,说明您已经熟

SpringCache -- Redis --- 配置与缓存使用--配置过期时间

写在前面:学redis,还是得搭配SpringCache来玩一玩。前置内容win安装+redis基础springboot使用redis文章目录导入依赖配置cache使用@Cacheable@CachePut@CacheEvict配置过期时间依据cacheName设置在注解上截取过期时间导入依赖<!--redis依赖--

面试:经典问题解决思路

1.秒杀系统架构参考:秒杀系统架构优化思路2.如何防止订单重复提交重复提交原因:一种是由于用户在短时间内多次点击下单按钮,或浏览器刷新按钮导致。另一种则是由于Nginx或类似于SpringCloudGateway的网关层,进行超时重试造成的。方案描述优点缺点方案一提交订单按钮置灰简单易实现,常用于短信验证码场景只能解决

第二证券:个人开证券账户要开户费吗?

随着互联网和移动端东西的遍及,越来越多的人开端涉足股票投资,开立证券账户也成为一个热门话题。但是,许多初学者或许会有疑问,个人开证券账户是否需求支付开户费呢?这个问题的答案并不是那么简略,需求考虑多方面的要素。首先,需求明确的是,证券账户开立都是需求遵循中国证监会的相关规矩的。按照现在的规矩,证券公司不得向客户收取开户

qt功能自己创作

按钮按下三秒禁用voidMainWindow::on_pushButton_5_clicked(){//锁定界面setWidgetsEnabled(ui->centralwidget,false);//创建一个定时器,等待3秒后解锁界面QTimer::singleShot(3000,this,[=](){setWidg

【计算机网络】——数据链路层(应用:介质访问控制)

//仅做个人复习和技术交流,图片取自王道考研,侵删一、大纲1、介质访问控制信道划分介质访问控制随机访问介质访问控制2、局域网3、广域网4、数据链路层设备二、介质访问控制省流:把广播信道通过介质访问控制机制逻辑上转换为点对点的信道。介质访问控制:采取一定措施,使得两个节点之间的通信不会发生相互干扰的情况。用来决定广播信道

6. 装饰器

UML聚合(Aggregation)关系:大雁和雁群,上图中空心菱形+箭头表示聚合关系组合(Composition)关系:大雁和翅膀,实心菱形+箭头表示组合(Composition)关系测试代码#include<iostream>#include<stdio.h>#include<mutex>//锁头文件usingna

c++运算符重载

目录运算符重载的基本概念重载加号运算符(+)类内实现类外实现运算符重载碰上友元函数可重载和不可重载的运算符可重载的运算符不可重载的运算符重载自加自减运算符(a++++a)智能指针重载等号运算符(=)重载等于和不等运算符(==!=)运算符重载的基本概念概念:运算符重载与函数重载比较类似,相当于让一个运算符具有另外一种含义

PHP 做 Mysql 数据统计,通过时间戳 统计 每分钟多少条 每十分钟多少条?

如果mysql表中数据结构时间字段是按时间戳存的,PHP如何按每分钟有多少条来统计数据<?php//连接MySQL数据库$servername="localhost";$username="your_username";$password="your_password";$dbname="your_database";

利用NHANES数据库还能构建预测模型? 中国学者写了篇文章,AUC=0.842

Nhanes美国营养调查数据库的培训课程(直播回放)来了!“Nhanes数据挖掘”课程(直播回放)!欢迎报名,发表文章即退款2021年2月,广东省医学科学院、广东省人民医院、广东省心血管研究所心内科,广东省冠心病防治重点实验室的学者在《AnnalsofPalliativeMedicine》(四区)发表题为:Deriva

基于Python+Tkinter实现一个贪食蛇小游戏

你是否还记得那个时代,当我们的手机还没有触摸屏,游戏也只有像“贪食蛇”这样的经典款?当时,许多人都沉迷于控制一条小蛇吃食物的乐趣中。而今,让我们利用Python和Tkinter,一起重温那个时代,制作自己的贪食蛇小游戏!1.初始设定在开始之前,我们需要对游戏进行基本的设定。例如,我们的游戏界面是一个宽600像素、高40

热文推荐