“这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战”
关注我,以下内容持续更新
一、树
-
结点的度(Degree): 一个节点含有的子树的个数称为该点的度
-
树的度: 一棵树中,最大的节点的度称为树的度
-
叶结点(Leaf): 度为0的结点. (也称为叶子结点)
-
路径和路径长度: 从结点n1到nk的路径为一个结点序列n1, n2,… , nk, ni是 ni+1的父结点。路径所包含边的个数为路径的长度。
-
结点的层次(Level): 规定根结点在1层,其它任一结点的层数是其父结点的层数加1。
-
树的高度或深度(Depth): 树中所有结点中的最大层次是这棵树的深度。
以这棵树为例对树的术语举例:
- 结点A和D的度数为3,结点E、F、G、H、I、J的度数均为0;
- 树的度为 3;
- A结点的层次是 1,B、C、D结点的层次是2;
- 树的深度是3
二、二叉树
1. 满二叉树(完美二叉树)
满二叉树:如果二叉树中除了叶子结点,每个结点的度都为2,则此二叉树称为满二叉树。
如图,这个二叉树是一个满二叉树,它的深度是4,有2^4-1个节点.
2. 完全二叉树
完全二叉树:如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。
完全二叉树的特点:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。需要注意的是,满二叉树肯定是完全二叉树,而完全二叉树不一定是满二叉树。
3. 二叉搜索树
⼆叉搜索树是⼀个有序树
- 若它的左⼦树不空,则左⼦树上所有结点的值均⼩于它的根结点的值;
- 若它的右⼦树不空,则右⼦树上所有结点的值均⼤于它的根结点的值;
- 它的左、右⼦树也分别为⼆叉排序树
4. 平衡⼆叉搜索树
平衡⼆叉搜索树:⼜被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是⼀棵空树或它的左右两个⼦树的⾼度差的绝对值不超过1,并且左右两个⼦树都是⼀棵平衡⼆叉树。
5. 堆
堆是一棵顺序存储的完全二叉树
-
大顶堆: 每个结点的值都大于或等于其左右孩子结点的值
-
小顶堆: 每个结点的值都小于或等于其左右孩子结点的值
堆的存储可以用一维数组来实现,对于n个元素的序列{R0, R1, ... , Rn}当且仅当满足下列关系之一时,称之为堆:
- Ri <= R2i+1 且 Ri <= R2i+2 (小顶堆)
- Ri >= R2i+1 且 Ri >= R2i+2 (大顶堆)
注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。
堆是特殊的完全二叉树,所以构造堆的过程是按照从上至下和从左至右的顺序进行的。堆的存储一般用数组来实现。假设堆的某个节点在数组中的下标为i
,那么它的父节点下标为(i-1)/2
;它的左子节点的下标为2*i+1
;它的右子节点的下标为2*i+2
。
大顶堆和小顶堆的示例
用一维数组表示上图的大顶堆
堆排序是堆的最典型的应用,升序排序用大顶堆,降序排序用小顶堆。
三、⼆叉树的存储方式
⼆叉树的存储方式有顺序存储和链式存储,链式存储用指针实现,顺序存储用一维数组来表示,如图所示:
① 顺序存储状态
假设二叉树的某个节点在数组中的下标为i
,那么它的父节点下标为(i-1)/2
;它的左子节点的下标为2*i+1
;它的右子节点的下标为2*i+2
。
② 二叉链表存储状态
四、二叉树的遍历
二叉树的遍历方式有两种,深度优先搜索(DFS)和广度优先搜索(BFS),深度优先搜索又分为3种遍历方式:前中后序遍历,这三种遍历方式都可以用递归和迭代两种方式来实现。广度优先搜索就是层次遍历,通过迭代来实现。
DFS的前中后序遍历的⾮递归的⽅式可以借助栈来实现;广度优先搜索可以利用队列来实现,因为队列是先进先出的数据结构,只有先进先出才能保证一层层的遍历二叉树
前中后序遍历的顺序如下
关注我
如果觉得我写的不错,请点个赞 关注我 您的支持是我更文最大的动力!