【数据结构从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

相关文章
|
3月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
102 1
|
1月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
102 64
|
18天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
60 16
|
1月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
22 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
1月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
1月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(三)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
1月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(二)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
1月前
|
存储
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(一)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
2月前
|
JSON 前端开发 JavaScript
一文了解树在前端中的应用,掌握数据结构中树的生命线
该文章详细介绍了树这一数据结构在前端开发中的应用,包括树的基本概念、遍历方法(如深度优先遍历、广度优先遍历)以及二叉树的先序、中序、后序遍历,并通过实例代码展示了如何在JavaScript中实现这些遍历算法。此外,文章还探讨了树结构在处理JSON数据时的应用场景。
一文了解树在前端中的应用,掌握数据结构中树的生命线
|
1月前
|
Java C++
【数据结构】探索红黑树的奥秘:自平衡原理图解及与二叉查找树的比较
本文深入解析红黑树的自平衡原理,介绍其五大原则,并通过图解和代码示例展示其内部机制。同时,对比红黑树与二叉查找树的性能差异,帮助读者更好地理解这两种数据结构的特点和应用场景。
30 0

热门文章

最新文章

下一篇
无影云桌面