【数据结构】树和二叉树的基础知识

简介: 数据结构中的树及二叉树的相关知识

前言


本章主要讲解:


数据结构中的树及二叉树的相关知识



树概念及结构



  • 概念:


树是一种非线性的数据结构,它是由nn>=0)个有限结点组成一个具有层次关系的集合

把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的


注意:

有一个特殊的结点,称为根结点(根节点没有前驱结点)

其余结点被分成 M(M>0) 个互不相交的集合 T1 、 T2 、 …… 、 Tm ,其中每一个集合 Ti(1<=i<= m)又是一棵结构与树类似的子树

每棵子树的根结点有且只有一个前驱,可以有 0 个或多个后继,因此,树是递归定义 的


52.png


  • 注:


  1. 树形结构中,子树之间不能有交集,否则就不是树形结构
  2. 除了根节点外,每个节点有且只有一个父节点
  3. 一棵树N个节点的树有N-1条边



相关概念


  • 图示:


53.png


53.png


树的表示


树结构相对线性表就比较复杂了:既要保存值域,也要保存结点和结点之间的关系

实际中树的多种表示:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法

注:这里就简单的了解其中最常用的孩子兄弟表示法(相比来说最好的)

结构:


typedef int DataType;//数据类型
struct Node
{
 struct Node* firstChild1; // 第一个孩子结点
 struct Node* pNextBrother; // 指向其下一个兄弟结点
 DataType data; // 结点中的数据域
};


图示:


54.png

树的实际运用:文件系统的目录树结构


55.png


二叉树概念及结构


  • 概念:


二叉树由一个根节点加上左子树和右子树组成:

1.二叉树度最大为2(度可以为0,1,2)

2.二叉树的子树有左右之分,次序不能颠倒(有序树)(没有左树,一定没有右树;有左树,不一定有右树)


56.png


特殊的二叉树


  • 满二叉树:


一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树

也就是说,如果一个二叉树的层数为K,且结点总数是2^k-1,则它就是满二叉树


  • 完全二叉树:


完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的(特殊的完全二叉树)

对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树


图示:

57.png


二叉树的性质

1.若规定根节点的层数为 1 ,则一棵非空二叉树的 第 i 层上最多有2^(i-1)个结点

2.若规定根节点的层数为 1 ,则 深度为 h的二叉树的最大结点数是2^h-1

3.对任何一棵二叉树 , 设 度为 0 其叶结点个数为n0 , 度为 2 的分支结点个数为n2 , 则有n0=n2 + 1

解释: 当只有一个节点时,n0=1,n2=0(符合)

接下来每增加一度2的树,都会增加2个度0的树(画图归纳理解)(符合)


图示:性质3


58.png


4.若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=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 否则无右孩子


图示:性质5



59.png


二叉树的存储结构


  • 存储结构类型:


顺序存储


顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树(不完全二叉树有空间的浪费而现实中使用中只有堆才会使用数组来存储

注:二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树


  • 图示:


60.png


链式存储


用链表来表示一棵二叉树,即用链来指示元素的逻辑关系

通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址

链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链(红黑树等结构会用到三叉链)


图示:


61.png


62.png


typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
    struct BinTreeNode* _pLeft; // 指向当前节点左孩子
    struct BinTreeNode* _pRight; // 指向当前节点右孩子
    BTDataType _data; // 当前节点值域
}


// 三叉链
struct BinaryTreeNode
{
 struct BinTreeNode* _pParent; // 指向当前节点的双亲
 struct BinTreeNode* _pLeft; // 指向当前节点左孩子
 struct BinTreeNode* _pRight; // 指向当前节点右孩子
 BTDataType _data; // 当前节点值域
};



相关文章
|
19天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
60 16
|
19天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
70 8
|
1月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
23 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
1月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
25 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
1月前
|
Java
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
28 1
|
1月前
|
算法 Java C语言
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
25 1
|
1月前
|
Java C++
【数据结构】探索红黑树的奥秘:自平衡原理图解及与二叉查找树的比较
本文深入解析红黑树的自平衡原理,介绍其五大原则,并通过图解和代码示例展示其内部机制。同时,对比红黑树与二叉查找树的性能差异,帮助读者更好地理解这两种数据结构的特点和应用场景。
32 0
|
1月前
|
存储 算法
探索数据结构:分支的世界之二叉树与堆
探索数据结构:分支的世界之二叉树与堆
|
1月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
25 0