知识导图
一、顺序表的查找
sorted string table 带哨兵的顺序查找算法:约定“返回0表示未找到目标”
typedef struct{//顺序表结构体定义
ElemType *R;//表基址(连续内存空间的起始地址)(R[0]作为哨兵,R[1]~R[length]存数据)
int length;//表长(实际数据元素个数)
}SSTable;
int Search_Seq(SSTable ST,KeyTable key){
ST.R[0]=key;//设置哨兵
//ST.R[i] ≡ *(ST.R + i),指针可以通过下标语法访问,本质是 “指针 + 偏移量”
//i--会使得当遍历到哨兵时相等跳出循环,i=0再自减1变为负数
for(int i=ST.length;ST.R[i]!=key;--i);
return i;//未找到则返回哨兵位置
}
二、折半查找(二分查找)
- 背景:(1)顺序存储(2)有序存放
- 非递归算法
- 递归算法
三、二叉排序树
- 链式存储
- 左子树所有节点都比根节点小,右子树所有节点都比根节点大
1、算法
2、插入
3、构造
4、删除
- 被删除的结点是叶子结点 将双亲结点中相应的指针域改为空
2. 被删除的结点只有左子树或右子树
将双亲结点的相应指针域的值指向被删除结点的左子树或右子树
3.被删除的结点既有左子树又有右子树
以其左子树中的最大值结点(或右子树中的最小值结点)替代之,然后用上述两种其一的方法删除该结点
(1)前驱替代 (2)后继替代
练习
四、哈希表
通过一个函数马上算出地址
- 线性探测:向后顺延找空余的空间
- 二次平方:1,-1,2^2,-2^2...
- 链地址法