🌲目录
1️⃣树概念及结构
❄️1.1树的概念
- 有一个特殊的结点,称为根结点,根节点没有前驱结点
- 除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继
- 因此,树是递归定义的😘。
注:树形结构中,子树之间不能有交集,否则就不是树形结构
❄️1.2 树的相关概念
节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点
非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点
❄️1.3 树的表示
typedef int DataType;
struct Node
{
struct Node* firstChild1; // 第一个孩子结点
struct Node* pNextBrother; // 指向其下一个兄弟结点
DataType data; // 结点中的数据域
}
❄️1.4 树在实际中的运用(表示文件系统的目录树结构)
如linux的目录,window的目录等等,基本都是用树状图来表示的。
2️⃣二叉树概念及结构
🌼2.1概念
二叉树的每个节点:或者为空或者由一个根节点加上两棵别称为左子树和右子树的二叉树组成。
注意:
- 二叉树不存在度大于2的节点
- 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树
🌼2.2满二叉树
如果一个二叉树的每个节点的度都为2,即每个节点都有两个分支,那么此二叉树就为满二叉树。其层数如果为k,那么其总节点个数为2^k-1;
🌼2.3完全二叉树
完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。
🌼2.4满二叉树和完全二叉树的区别
其实满二叉树是完全二叉树的特例,因为满二叉树已经满了,而完全并不代表满。满指的是出了叶子节点外每个节点都有两个孩子,而完全的含义则是最后一层没有满,并没有满。
- 满二叉树肯定是完全二叉树
- 完全二叉树不一定是满二叉树
🌼2.5二叉树的性质
![](https://i-blog.csdnimg.cn/blog_migrate/25a919ea1eaedaaa80422e0beee6f1a0.png)
2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点总数是 .
![](https://i-blog.csdnimg.cn/blog_migrate/46ab0d6783c265a2220940c27c9d707a.png)
4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,
- 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
- 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
- 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子
🌼2.6二叉树的存储结构
二叉树的存储结构有两种,分别为顺序存储和链式存储。
⭐️1.顺序存储
⭐️2.链式存储
3️⃣二叉树顺序结构
💫3.1二叉树的顺序结构
💫3.2堆的概念及结构
严格来讲,堆有不同的种类,但是我们在算法学习中,主要用的还是二叉堆,而二叉堆有最大堆和最小堆之分。
最大(最小)堆是一棵每一个节点的键值都不小于(大于)其孩子(如果存在)的键值的树。大顶堆是一棵完全二叉树,同时也是一棵最大树。小顶堆是一棵完全完全二叉树,同时也是一棵最小树。
需要注意的问题是:堆中的任一子树也还是堆,即大顶堆的子树也都是大顶堆,小顶堆同样。
🌊堆的性质:
- 堆中某个节点总是不大于或者不小于其父节点
- 堆是完全二叉树