【数据结构从0到1之树的初识】

简介: 树的表达方式集合中的元素关系呈现出一对多的情况

1.树的表达方式


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

image.png



1.1 树的定义


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


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


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


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

image.png

1.2树的相关概念


image.png

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


如上图: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 双亲表示法

image.png


概念:


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


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


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


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


特点分析:


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


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


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

image.png



1.3.2 孩子表示法

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


其存储过程是:


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


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


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

image.png



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


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


优化:


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


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

image.png



1.3.3 孩子兄弟表示法


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


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


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


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

image.png



示例:


image.png

image.png



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


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


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


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

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

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


1.4树在实际中的应用

image.png


后记:

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


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


下一篇链接☞ http://t.csdn.cn/z44i0

相关文章
|
2月前
|
算法
数据结构之博弈树搜索(深度优先搜索)
本文介绍了使用深度优先搜索(DFS)算法在二叉树中执行遍历及构建链表的过程。首先定义了二叉树节点`TreeNode`和链表节点`ListNode`的结构体。通过递归函数`dfs`实现了二叉树的深度优先遍历,按预序(根、左、右)输出节点值。接着,通过`buildLinkedList`函数根据DFS遍历的顺序构建了一个单链表,展示了如何将树结构转换为线性结构。最后,讨论了此算法的优点,如实现简单和内存效率高,同时也指出了潜在的内存管理问题,并分析了算法的时间复杂度。
67 0
|
15天前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
52 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
15天前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
39 12
|
15天前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
38 10
|
15天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
39 2
|
3月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
137 64
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
91 5
|
2月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
129 16
|
2月前
|
算法
数据结构之文件系统模拟(树数据结构)
本文介绍了文件系统模拟及其核心概念,包括树状数据结构、节点结构、文件系统类和相关操作。通过构建虚拟环境,模拟文件的创建、删除、移动、搜索等操作,展示了文件系统的基本功能和性能。代码示例演示了这些操作的具体实现,包括文件和目录的创建、移动和删除。文章还讨论了该算法的优势和局限性,如灵活性高但节点移除效率低等问题。
80 0
|
3月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
40 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)

热门文章

最新文章