数据结构的逻辑结构和存储结构
逻辑结构:线性表(1对1)、树(1对多)、图(多对多)
存储结构:顺序存储和链式存储
线性表
顺序存储的线性表。时间复杂度:索引取值O(1);据值查找O(n);插入O(n);删除O(n)。
链式存储的线性表。有单链表、双向链表、循环链表。时间复杂度:索引取值O(n);据值查找O(n);插入O(1);删除O(1)。
栈
栈先进后出,push压栈,pop弹栈,支持顺序存储和链式存储,用两个指针维护栈的情况。时间复杂度:索引取值O(n);据值查找O(n);插入O(1);删除O(1)。
队列
队列先进先出,队尾增加元素,队头删除元素,支持顺序存储和链式存储,其中顺序存储为了防止假溢出的情况,一般采用循环队列。时间复杂度:索引取值O(n);据值查找O(n);插入O(1);删除O(1)。
字符串
一般采用顺序存储,一般整个串整体操作。
串的模式匹配
数组
广义表
树和二叉树
二叉树的性质
- 二叉树第i层最多有2i-1个结点。
- 深度为k的二叉树最多有2k-1个结点。
- 完全二叉树性质:入度为1的结点只能有1个或0个;入度为0的结点数=入度为2的结点数+1。
- 树的结点数=树的边数+1。
- M个结点有M*2个指针(对于二叉树是2*M,n叉树是n*M),有M-1条边。
- N个结点的二叉树有N+1个空链指针。
二叉树的存储结构
一般用链式存储,有二叉链表、三叉链表,对于满二叉树或完全二叉树也可以用顺序存储(层序遍历)。
遍历二叉树(算法掌握)
先序遍历、中序遍历、后序遍历、层序遍历。
掌握:
- 遍历算法的递归、非递归;
- 队列实现的层序遍历;
- 根据遍历序列确定二叉树,包括创建二叉链表
- 计算二叉树的深度、结点数、获取结点父结点
- 统计二叉树中结点个数
树的存储结构
有双亲表示、孩子表示和使用最多的孩子兄弟表示(左孩子右兄弟)。
森林和二叉树的转换
左孩子右兄弟的方法。
哈夫曼树(最优二叉树)
概念:根结点到所有叶子结点到带权路径最优的二叉树。
哈夫曼树构造:
- 在森林中找到两个权值最小的树,作为左右子树构造一个新的二叉树,二叉树的根权值为左右子树权值之和。
- 将森林中的原来的两个树删除,