一、栈(Stack)
- 定义
(1)只允许在一端进行插入和删除的线性表
(2)先进后出 - 顺序栈
(1)定义
(2)初始化
(3)进栈
Tip:在 指针+1 前 指针 为0(指针永远指向栈顶)
(4)出栈
Tips:出栈在逻辑上删除了元素(指针下移)实际上要删除数据还是在的
(5)共享栈
- 链栈
(1)定义
二、队列(Queue)
-
定义
(1)**只允许在一端时插入(队尾)另一端删除(队头)**的线性表 -
实现
-
入队
Tips:
(1)取模是循环利用已经删除掉数据的空节点(循环队列)
(2)加上取模运算就是循环队列(有特殊判断情况),不加则是普通队列 -
循环队列
Tips:
要牺牲一个空节点给rear,否则rear=front就出错了
-
链式存储队列
(1)定义
(2)初始化
(3)入队
(4)删除
-
双端队列
三、串(String)
-
定义
(1)由零个或多个字符组成的有限序列
(2)子串:串中任意个连续的字符组成的子序列【空串(零串)也子串】
(3)空串【""】长度为0;空格串【"(空格)(空格)(空格)"】长度为3 -
基本操作
StrAssign(&T,chars) | 赋值
StrCopy(&T,S)| 复制
StrLength(S) | 求串长
CleanString(&S) | 清空串
DestoryString(&S) | 销毁串 -
串的顺序存储
-
串的链式存储
Tips:存不满用特殊字符代替
四、树(Tree)
- 定义
(1)根结点、子结点、双亲结点、孩子结点、兄弟结点
(2)度:树中一个结点的子结点的个数;树的度:树中最大的度数
(3)分支结点:度大于0的结点;叶子结点:度为0的结点
(4)结点的层次、结点的高度、结点的深度
Eg:B结点的层次:第二层(一共四层)、B结点的高度:3、D结点的深度:3
(5)有序树、无序树
(6)路径:树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的。
(7)分支是有向的
(8)路径长度:路径上所经历边的个数。Eg:A–>E路径长度为2
(9)森林:多棵互不相交的树的集合
2. 树的性质
(1)树中的结点数等于所有结点的度数加1,Eg:上图的树中的结点数为7
(2)度为m的树中第i层上至多有mi-1个结点(i≥1)
(3)高度为h的m叉树至多有( mh -1) / (m-1)个结点
- 二叉树
1、定义
(1)满二叉树:一棵高度为h,且含有2h -1个结点的二叉树为满二叉树。
(2)对于编号为i的结点,若存在,其双亲的编号为i/2],左孩子为2i,右孩子为2i+1。
(3)完全二叉树
设一个高度为h、有n个结点的二叉树,当且仅当其每个结点都与高度为h的满二叉树中编号1~n的结点——对应时,称为完全二叉树。
Tips:
1)若i≤[n/2],则结点i为分支结点,否则为叶子结点
2)叶子结点只可能在层次最大的两层上出现。对于最大层次的叶子结点,都依次排在最左边的位置上。3)度为1的结点若存在,则可能有一个,且是编号最大的分支节点,并孩子结点一定是左结点。
3)度为1的结点若存在,则可能有一个,且是编号最大的分支节点,并孩子结点一定是左结点。
(4)二叉排序树
对任意结点若存在左子树或右子树,则其左子树上所有结点的关键字均小于该结点,右子树上所有结点的关键字均大于该结点。
(5)平衡二叉树
树上任意结点的左子树和右子树的深度只差不超过1。
(6)非空二叉树上的叶子结点数等于度为2的结点数加1
(7)非空二叉树上第k层上至多有2k-1个结点(k≥1)
(8)高度为h的二叉树至多有2h-1个结点(h>1)
2、二叉树的存储结构
(1)顺序存储
Tips
1)如果没有用0或字符代替
2)顺序存储最坏情况下会非常浪费存储空间,比较适合完全二叉树
(2)链式存储
(3)二叉树的遍历
Tips visit()可以写任何东西例如打印…
1)先序遍历
算法书写
2)中序遍历
算法书写
3)后序遍历
算法书写
4)层次遍历
算法书写
3、树的存储结构
1)双亲表示法
(1)定义
2)孩子表示法
(1)定义
4、哈夫曼树
(1)定义
1)树的带权路径长度(WPL):树中所有叶节点的带权路径长度之和
Eg:
(2)哈夫曼树