尝试在软考61天前开始成为软件设计师-数据结构算法
数组与矩阵
存储地址的计算
a[n] 存储地址 : a+i*len
a[m][n] 存储地址:按行存储 : a+(i*n+j)*len
按列存储: a+(j*m+i)*len
例: 五行五列的a.各元素占2个字节 a[2][3]按行优先的存储 (2*5+3)*2
稀疏矩阵
- 上三角矩阵对应的一维数组下标计算
- 下三角矩阵
线性表
- 顺序表
- 链表
- 单链表
- 循环链表 尾指针指向头
- 双向链表 有指向前后的指针
链表操作:
- 单链表删除: 先q->next =a2 (备份); 更改要删除的a2-->a3
- 单链表插入:
- 双向链表删除:
- 双向链表插入:
顺序存储 | 链式 | ||
空间性能 | 存储密度 | =1,优 100%数据 | <1 |
容量分配 | 实现缺点 | 动态改变,优 | |
时间性能 | 查找运算 | O(n/2),略优 | O(n/2) |
读 | O(1)优 | O([n+1]/2),1~n | |
插入 | O(n/2),0~n ,后面补齐 | O(1)优 | |
删除 | O([n-1]/2) ,后面补齐 | O(1),优 |
栈-先进先出
队列-先进先出
循环队列: 空时 : head=tail; 满时:(tail+1)%size=head
循环队列一个空间不存东西--head=tail空时那个
广义表
通常以递归的方式定义
表里有字表
长度: 最外层表有多少元素
深度 :递归的重数
-LS1= (a,(b,c),(d,e)),长度为3,深度为2
基本运算: 取表头head(Ls),取表尾(tail(Ls)) 表尾是除表头外的所有元素!
-如何取出LS1的b? LS1= (a,(b,c),(d,e))
head(head(tail(Ls)))
树(无环路)
- 结点的度:结点的孩子结点数
- 树的度: 结点的度最高的
- 叶子结点: 末端结点,度=0
- 分支结点:
- 内部节点: 并非根节点&叶子结点
- 父节点,子节点 相对概念
- 兄弟结点: 同一层,同一个父亲
二叉树
- 满二叉树: 每层没有缺失的部分
- 完全二叉树:除了最下面一层,从左到右,上面都是完整的
- 非完全二叉树
重要特性!
二叉树第i层上 最多有
深度k的二叉树 最多有
叶子结点 = 度为2结点数+1
有n个结点的完全二叉树,从第一层~第层 有任意一个结点i
if : i为叶子结点
左子节点/2 ->父节点
(右子结点-1)/2->父节点
二叉树遍历
- 前序遍历 --根-左-右-12457836
- 中序遍历--左-根-右-42785136
- 后序遍历--左-右-根-48752631
- 层次遍历-12345678
反向构造二叉树
前序ABHFDECG
中序HBEDFAGC
一般给2种序列反向构造
树转二叉树
孩子-->左结点
兄弟-->右结点
查找二叉树
....未完待续