速学数据结构 | 树 森林 二叉树 的概念详讲篇

简介: 速学数据结构 | 树 森林 二叉树 的概念详讲篇

📋 前言

  🌈hello! 各位宝子们大家好啊,关于线性表我们已经在前面更新完了!

  ⛳️今天就来看一下复杂一些的数据结构 “树” 他的应用主要在哪些方面呢?以及结构是什么样的

  📚本期文章收录在《数据结构&算法》,大家有兴趣可以看看呐

  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

一、什么是树?

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

  • 所以他有一个根节点,根结点没有前驱结点。
  • 又因为树的节点除了根节点 外,还有很多子节点而子节点又有很多子节点
  • 所以树是由 递归创建

可能大家还不是很了解但大家看上面这张图,左边是一棵树,右边就是我们的 多叉树数据结构了;

  • 由树的根节点,加孩子节点。而孩子节点又有很多孩子节点组成的!
  • 所以我们说树是由递归创建的,他们每个部分都是相同的结构

1.1 树的注意事项

注意:树形结构中,子树之间不能有交集,否则就不是树形结构

  • 大家在做选择题的时候一定要注意了

1.2 树的相关概念

前面我们说了树是由 一个根节点加很多 子孙节点 组成的,那么他们相应的叫法是什么呢?


  • 结点的度:一个结点含有的子树的个数称为该结点的度; 如上图:A的为6
  • 🔥 叶结点或终端结点:度为0的结点称为叶结点; 如上图:B、C、H、I…等结点为叶结点
  • 🔥 非终端结点或分支结点:度不为0的结点; 如上图:D、E、F、G…等结点为分支结点
  • 🔥 双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点; 如上图:A是B的父结点
  • 🔥 孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点; 如上图:B是A的孩子结点
  • 兄弟结点:具有相同父结点的结点互称为兄弟结点; 如上图:B、C是兄弟结点
  • 树的度:一棵树中,最大的结点的度称为树的度; 如上图:树的度为6
  • 🔥 结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推
  • 🔥 树的高度或深度:树中结点的最大层次; 如上图:树的高度为4
  • 堂兄弟结点:双亲在同一层的结点互为堂兄弟;如上图:H、I互为兄弟结点
  • 🔥 结点的祖先:从根到该结点所经分支上的所有结点;如上图:A是所有结点的祖先
  • 🔥 子孙:以某结点为根的子树中任一结点都称为该结点的子孙。如上图:所有结点都是A的子孙
  • 森林:由m(m>0)棵互不相交的树的集合称为森林;

其中红色标记的是比较重要的概念大家可以重点记一下这些都是选择题经常出现的概念,像树的深度树的层级

  • 计算孩子节点/叶子节点的个数
  • 如果一个树的深度为4 那么他的最大节点个数是多少?

等等这样的题如果不了解这些概念的话是根本做不了的

1.3 树的应用场景有那些

诶不知道大家注意过没有我们的文件夹和树的结构很类似?

  • 由一个根文件组成,里面还有很多子文件夹,和子孙文件夹。

这里 Linux 的文件目录就是用多叉树实现的。

二 、二叉树的概念详讲

树的概念我们讲解了,但是其实我们应用最广的还是二叉树比如 八大排序里面的 堆排序快速排序 全都应用了树的思想。

  • 这俩总排序方法都是排序中最快的之一

那么什么是二叉树呢? 其实二叉树就是结点的一个有限集合

  • 该集合,要不为空
  • 要不就是由一个根结点加上两棵别称为左子树和右子树的二叉树组成

  1. 📌 二叉树不存在度大于2的结点
  2. 📌 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

2.1 特殊的二叉树

满二叉树

一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2 k − 1 2^k -12k1 ,则它就是 满二叉树

完全二叉树

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

  • 要注意的是满二叉树是一种特殊的完全二叉树。

2.2 二叉树的性质

二叉树是什么我们前面了解过了那么二叉树有那些性质是需要我们来了解一下的呢?

  1. 若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有2 ( i − 1 ) 2^{(i-1)}2(i1) 个结点.
  2. 若规定根结点的层数为1,则深度为h的二叉树的最大结点数是2 h − 1 2^h-12h1.
  3. 对任何一棵二叉树, 如果度为0其叶结点个数为 n 0 n_0n0, 度为2的分支结点个数为 n 2 n_2n2,则有n 0 n_0n0n 2 n_2n2+1
  4. 若规定根结点的层数为1,具有n个结点的满二叉树的深度h=l o g 2 ( n + 1 ) log_2(n+1)log2(n+1). (ps:l o g 2 ( n + 1 ) log_2(n+1)log2(n+1)是log以2为底,n+1为对数)
  5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有结点从0开始编号,则对于序号为i的结点有:
  1. 若i>0,i位置结点的双亲序号:(i-1)/2;i=0,i为根结点编号,无双亲结点
  2. 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
  3. 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子

三、二叉树的两种实现方法

3.1 顺序存储实现二叉树

好了讲了这么多大家估计也听的很迷糊,不要慌接下来我们就来看一下二叉树的实现来带大家吃下肉:

  • 二叉树的实现有俩总方式:其中顺序存储就是使用数据来进行存储
  • 利用其下标来进行控制左右子树。

🔥 注:一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费

大家看这个图片一但使用数组来存储普通的二叉树就会造成很大的空间浪费,顺序存储是由数组进行控制的。

  • 左子树就算不使用存储数据也要把空间给空出来

📚 代码演示:

typedef int HPDataType;
typedef struct Heap
{
  HPDataType* a;  //存储数据的数组
  int size;   //存储的数据个数
  int capacity; //二叉树的容量
}HP;

二叉树的链式结构就很简单了,我们前面说了利用顺序存储会造成空间的浪费而链式存储的就避免了这种情况和链表一样。

  • 需要了我们就去申请节点,不需要就不申请。
  • 这样就避免了空间的浪费

🔥 注意:上述代码并不是创建二叉树的方式,只是给大家演示一下后面博主会出一篇博文来进行讲解的。

📚 代码演示:

typedef int BTDataType;
typedef struct BinaryTreeNode
{
  BTDataType _data;
  struct BinaryTreeNode* _left;
  struct BinaryTreeNode* _right;
}BTNode;
BTNode* CreatBinaryTree()
{
 BTNode* node1 = BuyNode(1);
 BTNode* node2 = BuyNode(2);
 BTNode* node3 = BuyNode(3);
 BTNode* node4 = BuyNode(4);
 BTNode* node5 = BuyNode(5);
 BTNode* node6 = BuyNode(6);
 node1->_left = node2;
 node1->_right = node4;
 node2->_left = node3;
 node4->_left = node5;
 node4->_right = node6;
 return node1;
}
目录
相关文章
|
1月前
|
算法
数据结构之博弈树搜索(深度优先搜索)
本文介绍了使用深度优先搜索(DFS)算法在二叉树中执行遍历及构建链表的过程。首先定义了二叉树节点`TreeNode`和链表节点`ListNode`的结构体。通过递归函数`dfs`实现了二叉树的深度优先遍历,按预序(根、左、右)输出节点值。接着,通过`buildLinkedList`函数根据DFS遍历的顺序构建了一个单链表,展示了如何将树结构转换为线性结构。最后,讨论了此算法的优点,如实现简单和内存效率高,同时也指出了潜在的内存管理问题,并分析了算法的时间复杂度。
52 0
|
1天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
27天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
53 5
|
1月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
85 4
|
1月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
89 16
|
1月前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
132 8
|
1月前
|
算法
数据结构之文件系统模拟(树数据结构)
本文介绍了文件系统模拟及其核心概念,包括树状数据结构、节点结构、文件系统类和相关操作。通过构建虚拟环境,模拟文件的创建、删除、移动、搜索等操作,展示了文件系统的基本功能和性能。代码示例演示了这些操作的具体实现,包括文件和目录的创建、移动和删除。文章还讨论了该算法的优势和局限性,如灵活性高但节点移除效率低等问题。
54 0
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
210 9
|
1月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
35 1
|
1月前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。

热门文章

最新文章