在实际应用中,队列的顺序存储结构一般采用循环队列的形式。所谓循环队列,就是将队列存储空间的最后一个 位置绕到第一个位置,形成逻辑上的环状空间。在实际使用循环队列时,为了能区分队满还是队列空,通常需要增加一个标志 S S S。
循环队列主要有两种基本运算:入队运算和退队运算,复杂度都是O(1)O(1)O(1)
- 入队运算
指在循环队列的队尾加入一个新元素,首先 rear=rear+1 r e a r = r e a r + 1 rear=rear+1, 当 rear=m+1 r e a r = m + 1 rear=m+1 时,置 rear=1 r e a r = 1 rear=1,然后将新元素插入到队尾指针 指向的位置。当 S=1,rear=front S = 1 , r e a r = f r o n t S=1, rear=front,说明队列已满,不能进行入队运算,称为“上溢”。
- 退队运算
指在循环队列的排头位置退出一个元素并赋给指定的变量。首先 front=front+1 f r o n t = f r o n t + 1 front=front+1, 并当 front=m+1 f r o n t = m + 1 front=m+1 时,置 front=1 f r o n t = 1 front=1, 然后 将排头指针指向的元素赋给指定的变量。当循环队列为空 S=0 S = 0 S=0,不能进行退队运算,这种情况成为“下溢”。
非线性逻辑结构
树
树是一种简单的非线性结构。树型结构具有以下特点:
-
每个结点只有一个前件,称为父结点,没有前件的结点只有一个,称为树的根结点。
-
每一个结点可以有多个后件结点,称为该结点的子结点。没有后件的结点称为叶子结点
-
一个结点所拥有的后件个数称为结点的度
-
树的最大层次称为树的深度。
二叉树
二叉树是一种树型结构,通常采用链式存储结构,满足以下特性:
-
它的特点是每个结点至多只有二棵子树(即二叉树中不存在度大于 2 的结点);
-
二叉树的子树有左右之分,其次序不能任意颠倒。
二叉树的基本性质
-
在二叉树的第 i i i 层上至多有 2i−12i−12i-1 个结点
-
深度为 k k k 的二叉树至多有 2k−12k−12k-1 个结点( k≥1 k ≥ 1 k \geq 1)
-
在任意一个二叉树中,度为 0 的结点总是比度为 2 的结点多一个
-
具有 N N N 个结点的二叉树,其深度至少为 ⌊log2N⌋+1⌊log2N⌋+1\lfloor log_2 N \rfloor+1
-
霍夫曼树的带权路径长度 len=2n+1 l e n = 2 n + 1 len = 2n+1; n n n 为所以叶子权重和。
二叉树的遍历
就是遵从某种次序,访问二叉树中的所有结点,使得每个结点仅被访问一次。分为以下几种:
-
前序遍历(DLR): 首先访问根结点,然后遍历左子树,最后遍历右子树。
-
中序遍历(LDR): 首先遍历左子树,然后根结点,最后右子树
-
后序遍历(LRD): 首先遍历左子树,然后