线性表 有一定联系的数
顺序表存储 :节点逻辑关系由物体位置反映,储存密度为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四分树(点-区域四分树)
点四叉树
二分树
散列表
构造
直接定址 数字选择 平方取中 折叠 除余 基数转换 随机数法
处理冲突
开放地址 二次探查 随机探查 多散列函数和双散列函数探查 拉链