数据结构6——树与二叉树

在本专栏的前五篇中,我们学习了顺序表、链表、栈和队列,他们本质上都是线性表。有线性表就存在非线性表,现在我们就来学习一下结构更复杂的非线性表——树。



1. 树的概念与结构

1.1 树的概念

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

①有一个特殊的结点,称为根结点,根节点没有前驱结点;

②除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继,所以,树是递归定义的。

图示:

1.2 树的相关概念

节点的度:一个节点含有的子树的个数称为该节点的度, 如上图:A节点度的为3;

叶节点或终端节点:度为0的节点称为叶节点;,如上图:F、H、I、J、K、L节点为叶节点;

非终端节点或分支节点:度不为0的节点,如上图:B、C、D、E、G节点为分支节点;

双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点,如上图:A是B的父节点;

孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点,如上图:B是A的孩子节点;

兄弟节点:具有相同父节点的节点互称为兄弟节点,如上图:B、C是兄弟节点;

树的度:一棵树中,最大的节点的度称为树的度,如上图:树的度为3;

节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;

树的高度或深度:树中节点的最大层次,如上图:树的高度为4;

堂兄弟节点:双亲在同一层的节点互为堂兄弟,如上图:F、G互为堂兄弟节点;

节点的祖先:从根到该节点所经分支上的所有节点,如上图:A是所有节点的祖先

子孙:以某节点为根的子树中任一节点都称为该节点的子孙,如上图:所有节点都是A的子孙;

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

1.3 树的表示方法

在本专栏前五篇的前五篇文章中,我们了解到顺序表、链表、栈和队列都是用数组或指针连成的线性结构。可是树结构的表示方法就相对复杂了,既要保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。

#define MAX_TREE_SIZE 100
typedef int DataType;

///
//双亲表示法

typedef struct {
    DataType data;//节点的数据域
    int parent;//用整型表示自己的父节点
} PTNode;
typedef struct {
    PTNode nodes[MAX_TREE_SIZE];//存放树中所有节点
    int n;  // 树中结点个数
} PTree;

///
//孩子表示法

// 孩子结点结构体
typedef struct ChildNode {
    int child;
    struct ChildNode* next;
} ChildPtr;
// 树的结点结构体
typedef struct {
    DataType data;
    ChildPtr firstchild;
} CTBox;
// 树结构体
typedef struct {
    CTBox nodes[MAX_TREE_SIZE];
    int n, r;  // n是结点个数,r是根结点位置
} CTree;

///
//双亲孩子表示法

//孩子结点  
typedef struct CTNode//定义树中的一个结点  
{
    int child;//孩子结点的下标  
    struct CTNode* next;//指向下一个孩子结点的指针  
}*ChildPtr;

//表头结构  
typedef struct
{
    DataType data;//存放树中结点的数据  
    int parent;//存放双亲下标  
    ChildPtr firstchild;//指向第一个孩子的指针  
}CTBox;
//树结构  
typedef struct
{
    CTBox nodes[MAX_TREE_SIZE];
    int r;//根的位置索引  
    int n;//树中节点的总数
}PCTree;

我们这里就简单的了解其中最常用的孩子兄弟表示法:

 typedef int DataType;
struct Node
{
	struct Node* _firstChild1;		// 第一个孩子结点
	struct Node* _pNextBrother;		// 指向其下一个兄弟结点
	DataType _data;					// 结点中的数据域
};

1.4 树的应用

其实,文件系统的目录结构就是一个树结构,比如在Linux下使用tree命令可以看到:

2. 二叉树的概念与结构

2.1 二叉树的概念

度最多为2的树称为二叉树。

此外,二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。

所以,对于任意的二叉树都是由以下几种情况复合而成的:

2.2 特殊的二叉树

①满二叉树:一棵二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为N,且结点总数是2ⁿ-1,则它就是满二叉树;

②完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。要注意的是满二叉树是一种特殊的完全二叉树。

图示:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Go语言Gin框架的常规配置和查询数据返回json示例

文章目录 路由文件分组查询数据库并返回jsonservice层controller路由运行效果 启动多个服务 在 上一篇文章《使用Go语言的gorm框架查询数据库并分页导出到Excel实例》 中主要给大家分享了较多数据的时候如何使用go分页导出多个Excel文件并合并的实现方案&#xff0c;这一篇文章…

Linux之远程连接服务器

远程连接服务器的类型 文字接口 明文传输&#xff1a;Telnet 23、RSH等&#xff0c;目前非常少用&#xff1b; 加密传输&#xff1a;SSH为主&#xff0c;已经取代明文传输 ssh提供两个服务器功能&#xff1a;1.类似于telnet&#xff1b;2.类似于ftp的sftp-serve…

特斯拉自动驾驶出租车计划变成泡影?联想与Meta合作,推出面向PC的个人AI智能体AI Now|AI日报

文章推荐 Swarms Corporation创始人Kye Gomez实锤OpenAI多智能体Swarm抄袭其成果&#xff01;&#xff5c;AI日报 今日热点 中国海油“海能”人工智能模型正式发布 近日&#xff0c;由中国海油与中国电信、科大讯飞等企业合作打造“海能”人工智能模型正式推出。 中国海油“…

Centos7搭建minio对象存储服务器

Centos7搭建minio对象存储服务器 安装二进制程序配置服务文件 安装二进制程序 参考&#xff1a;https://segmentfault.com/q/1010000042181876 minio中国版&#xff1a;https://www.minio.org.cn/download.shtml#/linux # 下载二进制程序 wget https://dl.min.io/server/min…

鸿蒙--应用首次启动

最终效果 前言 基于自定义弹框、首选项和页面路由实现一个模拟应用首次启动的案例。需要完成以下功能: 实现四个页面,启动页、隐私协议页、广告页和应用首页。实现自定义隐私协议弹窗,点击协议可查看隐私协议具体内容。页面间的路由跳转。相关概念 首选项:首选项为应用提供…

软件工程:图书管理系统甘特图

1 实验目的 熟悉GanttProject 软件环境&#xff0c;能够使用GanttProject绘制甘特图,进行项目管理与规划。 2 实验内容 为小型图书管理系统项目的实施计划绘制甘特图。 小型图书管理系统项目包含登录、浏览、管理读者、管理图书资料、管理书目、登记借书、登记还书、预定图书、…

Snort浅析

Snort简介 Snort是免费开源的IDS/IPS&#xff08;入侵检测/防御系统&#xff09;系统&#xff0c;于1998年开发&#xff0c;旨在检测和响应网络中的可疑活动。包含流量/协议分析、内容匹配等功能&#xff0c;并可用预定义规则检测和防止各种攻击。官方网站&#xff1a;https:/…

出口摩洛哥提示 | 燃气器具和设备,2024年12月20日起需要标识Cmim Mark

Cmim Mark 为了证明产品符合摩洛哥的技术法规及标准&#xff0c;指导消费者正确选购&#xff0c;并协助政府有效管理市场&#xff0c;所有依据第24-09号法律规定的产品&#xff0c;必须加贴清晰的Cmim Mark&#xff0c;方可顺利进入摩洛哥市场。 根据摩洛哥官方公报发布的关于…

K歌与露营最搭配,AISON爱畅K歌音箱让露营更有趣

据市场调研数据显示&#xff0c;中国露营经济核心市场规模和带动市场规模均呈现逐年上升趋势&#xff0c;预计到2025年&#xff0c;中国露营经济核心市场规模将达到2483.2亿元。同时&#xff0c;《2024小红书搜索推广白皮书》显示&#xff0c;城市出行、音乐、旅游和户外等娱乐…

redis的配置文件redis.conf解析

我的后端学习大纲 我的Redis学习大纲 1.1.Redis的配置文件&#xff1a; 1.Redis的配置文件名称是&#xff1a;redis.conf 2.在vim这个配置文件的时候&#xff0c;默认是不显示行号的&#xff0c;可以编辑下面这个文件&#xff0c;末尾加上set nu&#xff0c;就会显示行号: 1.…

STM32应用详解(5)USART串口初始化

文章目录 一、USART初始化二、代码说明1.原理图2.main函数3.USART串口初始化函数4.代码整体结构 三、USART串口初始化总结 一、USART初始化 所谓的对USART进行初始化&#xff0c;就是对USART固件库函数的调用&#xff0c;来完成串口(USART)的设置&#xff0c;比如设置波特率、…

Docker 搭建mysql

拉取mysql镜像 docker pull mysql # 拉取镜像 [rooteason ~]# docker pull mysql Using default tag: latest latest: Pulling from library/mysql 72a69066d2fe: Pull complete 93619dbc5b36: Pull complete 99da31dd6142: Pull complete 626033c43d70: Pull complete 37d…

开放式耳机什么品牌最好?热门开放式蓝牙耳机推荐!

如今&#xff0c;开放式耳机如雨后春笋般涌现&#xff0c;丰富的产品类型确实让不少消费者陷入了选择的困境。很多人不知道哪个牌子的耳机好用&#xff0c;不过别担心&#xff0c;我精心搜罗了一批兼具时尚外观与卓越性能的开放式耳机。作为有着多年音频设备研究经验的专业人士…

sql server 行转列及列转行

图1 图2 1.行转列 &#xff08;图1->图2&#xff09; 1.方法一 (数据库通用&#xff09;&#xff0c;使用max 加case when 函数 -- 行转列 图1->图2 SELECT name,MAX(CASE WHEN subject语文 THEN score ELSE 0 END) AS "语文",MAX(CASE WHEN subject数学 …

OpenAI GPT-o1实现方案记录与梳理

本篇文章用于记录从各处收集到的o1复现方案的推测以及介绍 目录 Journey Learning - 上海交通大学NYUMBZUAIGAIRCore IdeaKey QuestionsKey TechnologiesTrainingInference A Tutorial on LLM Reasoning: Relevant methods behind ChatGPT o1 - UCL汪军教授Core Idea先导自回归…

64页精品PPT | 汽车经销商数据应用解决方案

汽车经销商正面临前所未有的盈利能力挑战。从18年起 &#xff0c;传统燃油车汽车行业开始步入低速增长阶段 &#xff0c;卖车已经挣不到钱 &#xff0c;利润往往来自任务完成的厂家返利&#xff1b;新兴的直营模式的出现 &#xff0c;冲击了传统授权经销的方式 &#xff0c;疫情…

【JS】双指针法获得满足四数之和且不重复的四元组

思路 本题做法与上一篇三数相加的做法相似&#xff0c;同样是使用双指针法&#xff0c;区别是这里多嵌一层循坏&#xff0c;遍历 i 和 j 的值&#xff08; j i 1&#xff09;&#xff0c;思路可参考笔记&#xff1a; 【JS】双指针法获得满足三数之和且不重复的三元组https://…

Git合并多个分支中的提交内容

IDEA中使用 IEAD编辑器中使用Git IEAD编辑器中使用Git 案例一&#xff1a; 把test分支的其中提交的内容合并到main分支上。 你现在通过IDEA开发的分支是test分支&#xff0c;当你在test分支把内容都写完了并且提交内容保存到了本地的git暂存区中的时候&#xff0c;如果此时你的…

【JAVA毕业设计】基于Vue和SpringBoot的员工绩效考核系统

本文项目编号 T 021 &#xff0c;文末自助获取源码 \color{red}{T021&#xff0c;文末自助获取源码} T021&#xff0c;文末自助获取源码 目录 一、系统介绍1.1 业务分析1.2 用例分析 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行…

【C语言刷力扣】367.有效的完全平方数

题目&#xff1a; 解题思路&#xff1a; 二分查找 时间复杂度&#xff1a; 空间复杂度&#xff1a; bool isPerfectSquare(int num) {int l 0, r 50000;while (l < r) {long long mid (l r) / 2;if (num < mid * mid) {r mid - 1;}else if (num > mid*mid) …