【数据结构】树(Tree)

✨✨✨专栏:数据结构     

          🧑‍🎓个人主页:SWsunlight

目录

 一、基本概念:

1、定义:

​编辑

​编辑

2、树的成分:

3、树的性质:

二、存储方式:

​编辑

双亲表示法:

孩子表示法:

孩子兄弟表示法(左孩子右兄弟):

 三、二叉树:

概念:

存储方式:

1、顺序存储(顺序表) 

2、链式存储(链表)


 一、基本概念:

1、定义:

        树是一种非线性的数据结构,它是由n(n>=0)有限结点组成一个具有层次关系的集合。为了使其抽象变得具体、易理解,且 因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的树


如下图:可以将最上面想象成树根,开始发散,然后就分化枝条 👉到最后没有枝条(黑色线)连接的是叶子(叶子节点)  

下图就是典型的树结构,树枝是不会有叶子的,所以只有分到最后一步了才是叶子;

注意:你看见过树的枝条会和另一根枝条相交么??正常情况的树不会的;换一个思路:可以理解为这是一个家族族谱,最上面的节点就是老祖,他生了孩子,孩子又继续生孩子,到你这一代即(叶子)  你想一下:家庭关系能乱掉么??要是随便一个祖先都能相交,岂不是伦理问题了!!!乱了,一切都乱了!!!!恐怕这个世界都疯了!!!

图中文字很好理解吧!一个人肯定只有一个爹,当然有个例外——老祖,它的父亲我们找不到,暂且没有

总结:

树是一种非线性的数据结构,它表现的关系是一对多

它是由n(n>=0)个结点组成的有限集,当n = 0时此时只有一个根节点,称为空树。

在任意一棵非空树中应满足:

1.有且仅有一个特殊的根节点,根节点没有前驱结点

2.每一个非根结点有且只有一个父亲结点

   除了根结点外,每个子结点可以分为多个不相交的子树,并且子树是不相交的

3.树是递归定义的

4.一颗N个结点的树有N-1条


2、树的成分:

前言:接下里讲述的各种名称是根据选则参考系来说的(例子为开头那张树的图)我们可以选整体一颗树来论,然后在树里面又有许多子树

总结:任何一棵树包含:根和子树——>{根+N棵子树(N>=0)};

  1. 根节点类比树根,,没有前驱节点,即没有父亲节点的节点,有且只有一个所有节点通过直接或间接方式都能找到此根节点。如:A就是这颗树的根节点
  2. 节点的度一个节点含有孩子的个数(或者说子树的个数,是我生的孩子(二代),即这个节点有几个孩子)。         如:A的度为3 、B的度为2、E的度为0、J的度为0;
  3. 叶节点/终端节点度为0的节​,类比树叶​​​​​​ 。            ​​​​​​​​​​​​如:J、F、K、L、H、I
  4. 非终端节点/分支节点:度不为0的节点。           如:B、C、D、E、G
  5. 父亲节点/双亲节点若一个节点含有子节点。    如:A是B和C、D的父亲
  6. 子节点/孩子节点一个节点含有子树的根节点(有父亲)。       如:B是A的孩子(子)节点,若是将B看成一颗子树的根节点 那么 E是B的孩子节点
  7. 兄弟节点具有同一个父亲节点(亲兄弟)。           如:E和F是兄弟节点
  8. 堂兄弟节点:双亲节点在同一成的节点互为堂兄弟。              如:E与G、H、I节点互为堂兄弟
  9. 节点的祖先:根节点该节点所径分支上(唯一路径上)的所有节点“直系亲属”)如下:红色圈就是一个路径,J的祖先就是E、B、A ;  而A是所有节点的祖
  10. 子孙:以某个节点为根的子树种,任意一个节点都是该节点(根)的子孙。                 如:B的子孙包括E、F、J
  11. 树的度:一颗树中,最大的 节点的度生的孩子最多个数 )。                   如:上图的树的度为:3
  12. 路径和路径长度:树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的,而路径长度是路径上所经过的边的个数(就是连接线的个数)
  13. 树的层次:从根开始定义,根结点为第1层,它的子结点为第2层,以此类推 
  14. 树的高度/深度:
    1. ​​​​​​​深度:是从根结点开始自顶向下逐层累加的
    2. 高度:是从叶结点开始自底向上逐层累加的。
    3. 树的高度(或深度)是树中结点的最大层数
    4. 如:上图的高度/深度是 4(与你怎么定义层数有关,第一层你是从0开始,还是从1开始计数,建议从1开始,因为开始时初始位置为0,若是0开始初始位置就是-1了)
  15. 森林:互不不想交的树(多棵树/多个根节点)            如:并查集

标红的是需要重点记住的

3、树的性质:

  • 结点数性质:树中结点的个数 == 所有节点的度数+1(根节点)
  • 层数性质:树的高度(层数)等于树中最大的层数,其中每一层包括所有结点中距离根结点最远的结点。
  • 度数性质:度为m的树中,第i层的结点数最多为m^(i-1)。 i>=1;
  • 结点数量与高度关系:一个高度为h的m叉树最多有  (m^h-1)/(m-1)  个结点。同样,一个具有n个结点的m叉树的最小高度为   logm(n*(m-1)

二、存储方式:

(1)、双亲表示法(2)孩子表示法(3)孩子兄弟表示法

双亲表示法:

我们假设以一组连续空间(数组)存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点到在表中的位置。也就是说,每个结点除了知道自已是谁以外,还知道它的双亲在哪里。

其中data是数据域,存储结点的数据信息。而parent是指针域,存储该结点的双亲在数组中的下标。

//数组大小
#define MAX_Size 100
typedef int FrDataType;//结点的结构
typedef struct Node
{FrDataType data;int parent;
}Node;
//树的结构
typedef struct Ptree {Node a[MAX_Size];//结点数组int r;//根的位置int n;//节点数}Ptree;

这样的存储结构,我们可以根据结点的parent 指针找到它的双亲结点,所用的时间复杂度为0(1),当到parent为-1时,表示找到了根节点。但是要知道结点的孩子是什么,需要遍历整个结构才行


孩子表示法:

把每个结点的孩子结点排列起来,以单链表作存储结构,则n个结点n个孩子链表,如果是叶子结点则将此单链表设为空。然后n个头指针又组成一个顺序表(线性表),采用顺序存储结构,存放进一个一维数组中,如图所示 数据A的下标为0,然后他的孩子有2个,下标分别为1和2,将1和2,存到了右边的数组中,再为下标1和下标2找孩子结点,下标为1的孩子只有一个,放到数组,以此类推

》》》设计两种结点结构,一个是孩子链表的孩子结点
其中child是数据域,用来存储某个结点在表头数组中的下标。next 是指针域,用来存储指向某结点的下一个孩子结点的指针


另一个是表头数组的表头结点

其中data是数据域,存储某结点的数据信息。firstchild 是头指针域存储该结点孩子链表的头指针

//树的孩子表示法结构定义
#define MAX_SIZE 100
typedef int FrDataType;
//孩子结点
typedef struct Node {int child;//记录每个孩子下标struct Node* next;
}*ChildPtr;
//表头结点
typedef struct {FrDataType data;ChildPtr firstchild;
}FrBox;
//树结构
typedef struct Ptree{FrBox node[MAX_SIZE];//结点数组int r;//根的位置int	n;//和结点数
}Ptree;

孩子兄弟表示法(左孩子右兄弟):

前面考虑了双亲和孩子。现在考虑兄弟来做;对于树这样的层级结构来说,只研究结点的兄弟是不行的,我们观察后发现,任意一棵树, 它的结点第一个孩子如果存在就是唯一的B它的右兄弟(“兄弟”是兄弟节点不是堂兄)如果存在也是唯一的;

 结构如下:child指向左边的第一个孩子,这么理解:后面我(父亲)陆续的生娃,第二个娃交给老大带,第三的娃交给老二带(A的生的第一个娃就是B,后面又生了娃C,娃C就是娃B的右兄弟,C交给B来带B->C,没有兄弟了就指向NULL)依次类推:

 结构如下:


//左孩子右兄弟法  树的定义
typedef int TrDataType;
typedef struct TreeNode
{TrDataType val;//数据struct TreeNode* leftchild;//左孩子struct TreeNode* rightBrother;//右兄弟}TreeNode;

这个其实就是二树,我们用这个方法将其变成了二叉树

 三、二叉树:

概念:

  定义:二叉树是另一种树形结构,其特点是每个结点至多只有两棵子树( 即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒,所以说是一颗有序树;
与树相似,二叉树也以递归的形式定义。二叉树是n (n≥0) 个结点的有限集合

二叉树的组成均由以下几种情况复合完成

 特殊的二叉树

满二叉树:每一个层的结点数都达到最大值 (满二叉树是一种特殊的完全二叉树)

完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。


二叉排序树:左子树上所有结点的关键字均小于根结点的关键字;右子树上的所有结点的关键字均大于根结点的关键字;左子树和右子树又各是一棵二叉排序树。


平衡二叉树:树上任一结点的左子树和右子树的深度之差不超过1。


 斜树:所有的节点都只有左或者右子树

二叉树的性质:
任意一棵树,若结点数量为n,则边的数量为n − 1。
非空二叉树上的叶子结点数等于度为2的结点数加1,即no = n2 + 1 。
非空二叉树上第k层上至多有2k − 1个结点( k ≥ 1 ) 。
高度为h的二叉树至多有2 h− 1个结点( h ≥ 1 ) 。
对完全二叉树按从上到下、从左到右的顺序依次编号1 , 2… ∗ , n 1,2…*,n1,2…∗,n,则有以下关系:
i > 1时,结点i的双亲的编号为i / 2,即当i 为偶数时, 它是双亲的左孩子;当i为奇数时,它是双亲的右孩子。
当2i ≤ n 时,结点i的左孩子编号为2i 否则无左孩子。
当2i + 1 ≤ n 时,结点i的右孩子编号为2i + 1,否则无右孩子。
结点i所在层次(深度)为{ l o g 2 i } +1。
具有n个( n > 0 ) 结点的完全二叉树的高度为{ l o g ~2 n~ } +1。
                        

存储方式:

1、顺序存储(顺序表) 

        使用数组来实现,一般来说使用数组只适用于完全二叉树;不是完全二叉树会有空间浪费的现象现实中,一般只有堆才会使用数组;在存储结构上是一个数组,逻辑结构上是一个完全二叉树

   

2、链式存储(链表)

        用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通链表中每个结点由三个域组成数据域左右指针域左右指针分别用来给出该结点左孩子 右孩子在的链结点的存储地址链式结构二叉链和三叉链

讲的不是很详细,略微了解一下,具体的等学的更深刻了,继续补充

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

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

相关文章

【C语言每日题解】用函数来模拟实现strlen()、strcpy()、strcmp()、strcat()

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊ 学习了函数后,老师让我们用函数来实现上面这四个字符串函数。 我们首先来了解一下这四个字符串函数: 1.strlen函数 用于获取字符串长度(不包括末尾…

【源码】相亲交友系统全新UI/情感测试/婚庆中介/交友系统

【交友】相亲交友系统全新UI/情感测试/婚庆中介/交友系统 带商城,情感测试。 https://www.52codes.cc/codes/qt

从开发板导出根文件系统并修改(Ubuntu)

前面提到过基于ubuntu-base去构建根文件系统基于Ubuntu-base构建根文件系统-CSDN博客,但是有时候我们并不需要重头开始,可以基于现有的根文件系统做调整。又或者我们直接在出厂的系统上去搭建好自己的运行环境并且编译出自己想要的程序,现在要…

医学科技查新中对查新点的撰写方法!附案例讲解!

我国的科技查新工作最早是从医学领域开始的,始于1985年中国科学院医学情报所,后来逐步发展到工、农等其 他各个领域。医学科技查新包括立项查新和成果查新两个部分,其中医学立项查新,它是指在医学科研项目申报开题之前&#xff0c…

上海初中生古诗文大会倒计时4个月:单选题真题示例和独家解析

现在距离2024年初中生古诗文大会还有4个多月时间,备考要趁早,因为知识点还是相对比较多的。这些知识点对于初中语文的学习也是很有帮助的。 今天我们继续来看10道选择题真题和详细解析,以下题目截取自我独家制作的在线真题集,都是…

取名时,要考虑生肖的影响

亲爱的宝宝们,又是一年五一小长假,峰民想大家都在休假吧!真幸福!峰民每天都在工作,几乎没有休过假,因为每天全国各地找我们取名改名客户是络绎不绝,峰民虽然也很辛劳,但也很有成就感…

【c++算法篇】滑动窗口

🔥个人主页:Quitecoder 🔥专栏:算法笔记仓 目录 1.长度最小的子数组2.无重复字符的最长子串3.最大连续1的个数 III4.将 x 减到 0 的最小操作数5.水果成篮6.找到字符串中所有字母异位词7.串联所有单词的子串8.最小覆盖子串 滑动窗…

李宏毅-Self-attention机制详解

原视频链接:attention 一. 基本问题分析 1. 模型的input 无论是预测视频观看人数还是图像处理,输入都可以看作是一个向量,输出是一个数值或类别。然而,若输入是一系列向量,长度可能会不同,例如把句子里的…

C 深入指针(4)

目录 一、字符指针变量 1 初始化 2 与字符串数组的区别 二、数组指针变量 1 初始化 2 二维数组传参本质 三、函数指针变量 1 初始化 2 用法 四、typedef关键字 五、函数指针数组 一、字符指针变量 1 初始化 //VS2022 x64 #include <stdio.h> int main() {…

人形机器人场景应用全解析,2024睿抗 AI ROBOT创新挑战赛火热报名中!

人工智能&#xff08;AI&#xff09;已成为推动科技革命和产业变革的关键力量。随着大模型等AIGC技术的迅猛发展&#xff0c;AI正深刻改变我们的生活并重新定义生产方式。越来越多人期望将AI技术从纯粹的思维和计算扩展到与物理世界的互动中&#xff0c;即发展具身智能。 为了推…

探索中国文本到视频AI模型——Vidu

引言 随着人工智能技术的不断进步&#xff0c;我们见证了从文本到视频内容生成的革命。最近&#xff0c;一个名为Vidu的中国文本到视频AI模型引起了全球的关注。由清华大学和中国AI初创公司声书科技联合开发的Vidu&#xff0c;于2024年4月27日宣布&#xff0c;它声称能够生成高…

个人工控方面收藏网址记录(持续更新中)

1、OPC类 OPC Foundation GitHub Downloads - Unified Automation (unified-automation.com) 物联网IoT协议之OPC UA快速入门教程 | 源码先生的调试人生 (debugself.com) OPC Servers - OPC UA Migration - 100 Solutions by Matrikon (matrikonopc.com) Prosys OPC UA Simu…

k8s coredns配置

1.coredns可根据集群具体数量修改pod数&#xff0c;官方推荐比例为5/1&#xff0c;即有15台服务器最好是3个pod。 2.coredns会继承pod所在主机的dns解析,修改了主机的dns解析之后&#xff0c;coredns有一段时间的缓存&#xff0c;重启coredns才会在集群内部立刻生效该解析。 …

SpringBoot3集成WebSocket

标签&#xff1a;WebSocket&#xff0c;Session&#xff0c;Postman。 一、简介 WebSocket通过一个TCP连接在客户端和服务器之间建立一个全双工、双向的通信通道&#xff0c;使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据&#xf…

003_PyCharm的安装与使用

如果你正在学习PyQt&#xff0c;本系列教程完全可以带你入门直至入土。 所谓从零开始&#xff0c;就是从软件安装、环境配置开始。 不跳过一个细节&#xff0c;不漏掉一行代码&#xff0c;不省略一个例图。 IDE 开始学习一个编程语言&#xff0c;我们肯定是首先得安装好它&…

Python代码:十、字符串连接

1、题目 小明有两个最好的朋友&#xff0c;他们的名字分别用input读入记录在两个字符串中&#xff0c;请使用字符串连接&#xff08;&#xff09;帮助牛牛将两个朋友的名字依次连接在一个字符串中输出。 2、代码 import sysstr1 input() str2 input() str3 str1 str2 pr…

从0到1:使用HuggingFace的管线加载Diffusion模型生成第一张图像!

Hugging Face系列1&#xff1a;详细剖析Hugging Face网站资源 前言本篇摘要1. Hugging Face Hub三大件1.1 模型1.1.1 模型简介1.1.2 制作模型卡片1.1.3 模型下载和上传1.1.4 模型应用 1.2 数据集1.2.1 数据集简介1.2.2 调用代码1.2.3 AutoTrain在线微调 1.3 Space应用1.3.1 内容…

理解 Python 中的 `super()` 与 `__init__()` 方法

在 Python 的面向对象编程中&#xff0c;super() 函数和 __init__() 方法是两个非常重要的概念。它们在类的继承和初始化过程中扮演着关键的角色。本文将深入探讨这两个概念的工作原理&#xff0c;并通过示例代码来展示它们的使用。 基本原理 __init__() 方法 __init__() 是…

C# 结合 JavaScript 对 Web 控件进行数据输入验证

目录 关于数据验证 范例运行环境 验证设计 JavaScript 方法 设计 实现 调用示例 C# 方法 设计 实现 调用示例 小结 关于数据验证 在 Web 应用的录入界面&#xff0c;数据验证是一项重要的实现功能&#xff0c;数据验证是指确认 Web 控件输入或选择的数据&#xff…

C语言.动态内存管理

动态内存管理 1.为什么要有动态内存分配2.malloc和free2.1malloc2.2free 3.calloc和realloc3.1calloc3.2realloc 4.常见的动态内存管理的错误4.1对NULL指针解引用操作4.2对动态开辟空间的越界访问4.3对非动态开辟内存使用free释放4.4使用free释放一块动态开辟内存的一部分4.5对…