线性表 有一定联系的数
顺序表存储 :节点逻辑关系由物体位置反映,储存密度为1,储存为o(1),插入删除需要移动平均一半节点
链表存储:额外空间表示逻辑关系,储存密度小于1,储存为o(n),插入删除只需要修改指针,
==========
栈的顺序存储,链式存储
队列的顺序存储,链式存储
串的顺序储存,链式存储,索引存储,匹配的算法BF算法,KMP算法
==============
数组的储存
三元组表(顺序储存)
十字链表(链式储存)
广义表的储存(表里可以有表)
头尾链表
扩展线性链表
===============
二叉树
顺序存储,二叉链式存储
二叉树的前序遍历
根据树得 前序表达
preorder(bitree t) { if(t==null)return; print---t->data preorder(t-left) preorder(t-right }
根据输入得树结构
#include <iostream>
/** 在学习二叉树遍历的时候我们学习了三种遍历方法 前序 中序 后序 同时我们知道给定前序和中序、中序和后序我们可以还原二叉树, 记得当时只是在纸上画了一画。现在把当时的想法完成。 给定前序和中序还原二叉树。。。 */ using namespace std; typedef struct node { char value; struct node *lh; struct node *rh; }node; node* buildtree(char pre[],char mid[],int n) //n为子树结点个数 { if(n == 0) return 0; node *p = new node; p->value = pre[0]; int i; for(i=0;i<n;i++) { if(mid[i] == pre[0]) break; } p->lh = buildtree(pre+1,mid,i); p->rh = buildtree(pre+i+1 ,mid+i+1,n-i-1); return p; } void print(node *root) { if(root == 0) return; cout<<root->value<<" "; print(root->lh); print(root->rh); } int main() { char pre[10]; char mid[10]; int n;//树结点数 cin>>n; cin>>pre; cin>>mid; node *p; p = buildtree(pre,mid,n); print(p); return 0; }
二叉树的层次遍历
入队(根) while(队列不空) 出队(指针p) 输出p 入队(左孩子) 入队(右孩子)
递归消除
算台阶,存每一步
第一+第二 循环
用栈消除递归
线索二叉树
标志位为0 表示该位指向结点的左孩子指针
标志位为1 表示该位指向结点的前趋左索引(前序排列的上一位)
同理还有右
树到二叉树
所有兄弟结点加一连线
只保留与厂子的连线外,去掉改结点与其他孩子的连线
森林到二叉树
先将森林每棵树变二叉树
根节点视为是兄弟连起来
二叉树到森林
左孩子变为其长子,右孩子变为右兄弟
树的存储
双亲链表表示法
孩子链表表示法
最优二叉树(哈夫曼树)
最底下有数据的结点都有权重
把最小的2个结点合起来,再和第3小的合起来(对于判定树则有时候需要看相连的权重)
可用于哈夫曼编码
=====================================
图
图的储存
邻接矩阵表示法
邻接表表示法
生成树(dfs bfs)
深度优先搜索dfs
void dfsL(lk_graph *g, int v) { pointer p; print(v) ;visited[v]=1; while(p!=null) { if(!visited[p->no]) dfsL(g,p->no) p = p->next; } }
广度优先搜索bfs
最小生成树 (每个连线都有权值,没方向)
priim算法 普里姆(连接已知最小的)
kruskal算法 克鲁斯卡尔
最短路径(每个连线都有权值,有方向)
单源最短路径(dijkstra算法)
所有顶点对之间的最短路径(floyd算法)
拓扑排序(工程有先后顺序,每个连线都有权值,有方向)
关键路径(路径长度最长)
=============
排序
https://blog.csdn.net/a133900029/article/details/80574849
===============
查找表
顺序表上的查找(顺序查找)
有序表(二分查找,插值查找,斐波那契查找)
索引顺序表(分块查找)块里面的关键字是该块的最大值
二叉排序树(二叉查找树)(左边比中间小,右边比中间大)
平衡二叉树(AVL)任意一结点左右子树的高度差为-1,0,1
B树(按阶数)
B+树
空间树表(多个关键字查找)
k-d树
pr四分树(点-区域四分树)
点四叉树
二分树
散列表
构造
直接定址 数字选择 平方取中 折叠 除余 基数转换 随机数法
处理冲突
开放地址 二次探查 随机探查 多散列函数和双散列函数探查 拉链