数据结构教程与题解 读后总结


线性表   有一定联系的数


顺序表存储 :节点逻辑关系由物体位置反映,储存密度为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四分树(点-区域四分树)

点四叉树

二分树


散列表

构造

直接定址  数字选择  平方取中  折叠  除余  基数转换  随机数法

处理冲突

开放地址  二次探查 随机探查  多散列函数和双散列函数探查 拉链






猜你喜欢

转载自blog.csdn.net/a133900029/article/details/80791188
今日推荐