【数据结构从0到1之树的初识】
创始人
2024-05-23 00:50:43
0

目录

1.树的表达方式

1.1 树的定义

1.2树的相关概念

1.3树的存储结构

1.3.1 双亲表示法

1.3.2 孩子表示法

1.3.3 孩子兄弟表示法

1.4树在实际中的应用

后记:

🕺作者: 迷茫的启明星

😘欢迎关注:👍点赞🙌收藏✍️留言

🎃系列专栏:

                        🛫 《C语言从0到1专栏》

                        🛫《数据结构从0到1专栏》

                        🛫 《C语言杂谈》

                        🛫《数据库》
🏇家人们,码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢观看!!!

持续更新中~


1.树的表达方式

集合中的元素关系呈现出一对多的情况

1.1 树的定义

  • 树(Tree)是n(n≥0)个节点的有限集合T,它满足两个条件 :

    • 有且仅有一个特定的称为根(Root)的节点

    • 其余的节点可以分为m(m≥0)个互不相交的有限集合T1、T2、……、Tm,其中每一个集合又是一棵树,并称为其根的子树(Subtree)。

  • 树的定义具有 递归性,即“树中还有树”。

1.2树的相关概念

  • 节点的度:一个节点含有的子树的个数称为该节点的度;

    • 如上图:A的为6

  • 叶节点或终端节点:度为0的节点称为叶节点;

    • 如上图:B、C、H、I...等节点为叶节点

  • 非终端节点或分支节点:度不为0的节点;

    • 如上图:D、E、F、G...等节点为分支节点

  • 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;

    • 如上图:A是B的父节点

  • 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;

    • 如上图:B是A的孩子节点

  • 兄弟节点:具有相同父节点的节点互称为兄弟节点;

    • 如上图:B、C是兄弟节点

  • 树的度:一棵树中,最大的节点的度称为树的度;

    • 如上图:树的度为6

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

  • 树的高度或深度:树中节点的最大层次;

    • 如上图:树的高度为4

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

    • 如上图:A是所有节点的祖先

  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。

    • 如上图:所有节点都是A的子孙

  • 森林:由m(m>0)棵互不相交的多颗树的集合称为森林;(数据结构中的学习并查集本质就是一个森林)

1.3树的存储结构

1.3.1 双亲表示法

概念:

  • 双亲表示法采⽤顺序表(也就是数组)存储普通树

  • 其实现的核心思想是:顺序存储各个节点的同时,给各节点附加一个记录其⽗节点位置的变量

  • 根节点没有⽗节点(⽗节点又称为双亲节点),因此根节点记录⽗节点位置的变量通常置为 -1

  • 利⽤顺序表存储,表元素由数据和⽗结点构成

  • 特点分析:

    • 根结点没有双亲,所以位置域设置为-1

    • 知道一个结点,找他的⽗结点,非常容易,O(1)级

    • 找孩子节点,必须遍历整个表(需要寻找parent的值等于此数组下标的节点)

1.3.2 孩子表示法

孩子表示法存储普通树采⽤的是 "顺序表+链表" 的组合结构。

其存储过程是:

        从树的根节点开始,使⽤顺序表依次存储树中各个节点。

        需要注意,与双亲表示法不同的是,孩子表示法会给各个节点配备一个链表,⽤于存储各节点的孩子节点位于顺序表中的位置。

        如果节点没有孩子节点(叶子节点),则该节点的链表为空链表。

使⽤孩子表示法存储的树结构,正好和双亲表示法相反

查找孩子结点的效率很⾼,⽽不擅长做查找⽗结点的操作

优化:

我们还可以将双亲表示法和孩子表示法合二为一

  • 一个节点同时存储父节点下标和子节点链表

1.3.3 孩子兄弟表示法

 在树结构中,同一层的节点互为兄弟节点。

        例如普通树中,节点 A、B 和 C 互为兄弟节点,⽽节点 D、E 和 F 也互为兄弟节点。

所谓孩子兄弟表示法,指的是⽤将整棵树⽤二叉链表存储起来

        具体实现方案是:从树的根节点开始,依次存储各个结点的孩子结点和兄弟结点。 在二叉链表中,各个结点包含三部分内容:

示例:

在以孩子兄弟表示法构建的二叉链表中,如果要查找结点 x 的所有孩子

则只要根据该结点的 firstchild 指针找到它的第一个孩子

然后沿着孩子结点的 nextsibling 指针不断地找它的兄弟结点

就可以找到结点 x 的所有孩子。

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

这是最常用的结构,后面我们将以此为基础使用代码实现二叉树的相关应用

1.4树在实际中的应用

后记:

此篇讲述了树的基本概念及相关的实现方式和实际生活中的应用等内容。

下篇将讲述二叉树概念·代码实现·堆排序等相关内容。

链接:http://t.csdn.cn/z44i0

分享喜欢的一句话:

迷茫不是一件坏事。

在迷茫中能把事情完成就是好事。

很多人会细细考量任务的艰巨程度,把一切都看得很复杂,导致他们在半路上停下来。

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...