
数据结构与算法
weixin_42681308
这个作者很懒,什么都没留下…
展开
-
严书中序遍历线索树的线索化&遍历
二叉树的二叉线索存储表示// -----二叉树的二叉线索存储表示-----typedef enum{Link,Thread}PointerTag; // 指针标志:0为指针,1为线索typedef struct BiThrNode{ TElemType data; // 结点元素信息 struct BiThrNode *lchild,*rchild; // 左右孩子指针 Poi...原创 2019-08-11 15:44:22 · 189 阅读 · 0 评论 -
浙江大学数据结构(5.2.1什么是哈夫曼树)
哈夫曼树与哈夫曼编码什么是哈夫曼树(Huffman Tree)[例]将百分制的考试成绩转换为五分制的成绩if (score<60) grade=1;else if (score<70) grade=2;else if (score<80) grade=3;else if (score<90) grade=4;else grade=5;判定树...转载 2019-05-15 09:59:29 · 173 阅读 · 0 评论 -
浙江大学数据结构(6.2.1图的遍历—BFS)
广度优先搜索(Breadth First Research,BFS)类比二叉树的层序遍历void BFS(Vertex V){ visited[V]=true; Enqueue(V,Q); while(!IsEmpty(Q)) { V=Dequeue(Q); for (V的每个邻接点W) if (!...转载 2019-05-20 09:01:51 · 132 阅读 · 0 评论 -
浙江大学数据结构(6.2.1图的遍历—DFS)
深度优先搜索(Depth First Search,DFS)void DFS (Vertex V){ visited[V]=true; for(V的每个邻接点) if (!visited[W]) DFS(W); }类似于树的先序遍历 若有N个顶点,E条边,时间复杂度是用邻接图存储图,有O(N+E),(访问N条链表即可) 用...转载 2019-05-20 08:49:59 · 199 阅读 · 0 评论 -
浙江大学数据结构(小白专场:程序框架及建树)
程序框架搭建int main(){ 对每组数据 读入N和L 根据第一行序列建树T 依据树T分别判别后面的L个序列 是否能与T形成同一搜索树并输出结果 return 0;}需要设计的主要函数:读数据建搜索树T 判别一序列是否与T构成一样的搜索树int main(){ int N,L,i; Tree T; sc...转载 2019-05-09 23:00:03 · 207 阅读 · 0 评论 -
浙江大学数据结构(小白专场:是否为同一棵二叉搜树)
题意理解给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。 问题:对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。 ###输入样例:4 2 //4为二叉搜索树的结点个数,2表示有两组需要与对照组比较3 1 4 2 //对照组3 4 1 2 // 比较组13 2 4 1 // 比较组22 1 // ...转载 2019-05-09 22:15:01 · 219 阅读 · 0 评论 -
浙江大学数据结构(6.1.1什么是图—邻接表表示法)
邻接表:G[N]为指针数组,对应矩阵每行一个链表,只存非0元素方便找任一顶点的所有“邻接点” 节约稀疏图的空间(需要N个头指针+2E个结点(每个结点至少2个域)) 方便计算任一顶点的“度”?对无向图:是的 对有向图:只能计算“出度”;需要构造“逆邻接表”(存指向自己的边)来方便计算“入度”方便检查任意一对顶点间是否存在边?No!...转载 2019-05-19 23:13:40 · 322 阅读 · 0 评论 -
浙江大学数据结构(6.1.2什么是图—邻接矩阵表示法)
怎么在程序中表示一个图?邻接矩阵G[N][N]——N个顶点从0—N-1编号 G[i][j]=1(若<Vi,Vj>是G中的边) 0(否则)问题:对于无向图的存储,怎样可以省一半空间? 用于一个长度为N*(N+1)/2的1维数组A存储{G00,G10,G11,...,Gn-1 0,...Gn-1 n-1} 则Gij在A中对应的下标是:(i*(i+1)/2+j) 对应网络,...转载 2019-05-19 22:57:26 · 271 阅读 · 0 评论 -
浙江大学数据结构(6.1.1什么是图—定义)
什么是图?表示“多对多”的关系 包含一组顶点:通常用V(Vertex)表示顶点集合 一组边:通常用E(Edge)表示边的集合 边是顶点对:(v,w)属于E,其中v,w属于V 有向边<v,w>表示从v指向w的边(单行线) 不考虑重边和自回路抽象数据类型定义类型名称:图(graph) 数据对象集:G(V,E)由一个非空的有限顶点集合V和一个有限边集合E组成。常见术...转载 2019-05-19 22:08:06 · 105 阅读 · 0 评论 -
浙江大学数据结构(5.1.4堆的建立)
最大堆的建立堆的一个应用:堆排序——需要先建堆 建立最大堆:将已经存在的N个元素按最大堆的要求存放在一个一维数组中方法1:通过插入操作,将N个元素一个个相继插入到一个初始为空的堆中去,其时间代价最大为O(NlogN)。 方法2:在线性时间复杂度下建立最大堆。 (1)将N个元素按输入顺序存入,先满足完全二叉树的结构特性 (2)调整各结点位置,以满足...转载 2019-05-14 18:09:07 · 349 阅读 · 0 评论 -
浙江大学数据结构(5.1.3最大堆的删除)
最大堆的删除取出根节点(最大值)元素,同时删除堆的一个结点。ElementType DeleteMax(MaxHeap H){ int Parent,Child; ElementType MaxItem,temp; if (isEmpty(H)) { printf("Empty Heap"); return; } ...转载 2019-05-14 16:32:04 · 187 阅读 · 0 评论 -
浙江大学数据结构(5.1.2堆的插入)
最大堆的操作最大堆的创建typedef struct HeapStruct* MaxHeap;struct HeapStruct{ ElementType *Elements; // 存储堆元素的数组 int Size; // 堆的当前元素个数 int Capacity; // 堆的最大容量};MaxHeap Create(int MaxSize)...转载 2019-05-14 16:19:19 · 152 阅读 · 0 评论 -
浙江大学数据结构(5.1.1什么是堆)
优先队列的完全二叉树表示堆的两个特性结构性:用数组表示的完全二叉树 有序性:任一结点的关键字是其子树所有结点的最大值(或最小值)最大堆(MaxHeap),也称“大顶堆” 最小堆(MinHeap),也称“小顶堆”...转载 2019-05-13 21:49:09 · 136 阅读 · 0 评论 -
浙江大学数据结构(4.2.平衡二叉树的调整)
不平衡的“发现者”是Mar,“麻烦结点”Nov在发现者右子树的右边,因而叫RR插入,需要RR旋转(右单旋) 不平衡的“发现者”是Mar,“麻烦结点”Apr在发现者左子树的左边,因而叫LL插入,需要LL旋转(左单旋) LR旋转 RL旋转...转载 2019-05-05 19:01:26 · 174 阅读 · 0 评论 -
浙江大学数据结构(4.2.1什么是平衡二叉树)
【例】搜索树结点不同插入次序,将导致不同的深度和平均查找长度ASL“平衡因子(BinTree Factor,简称BF)”:BF(T)=hL-hR,其中hL和hR分别为T的左、右子树的高度。平衡二叉树(Balanced Binary Tree)(AVL树)空树 任一结点左、右子树高度差的绝对值不超过1,即|BF(T)|<=1平衡二叉树的高度能达到log2n吗?设nh高度为h...转载 2019-05-05 17:02:56 · 162 阅读 · 0 评论 -
浙江大学数据结构(3.3.4二叉树的应用)
[例]遍历二叉树额应用:输出二叉树中的叶子结点。在二叉树的遍历算法中增加检测结点的“左右子树是否都为空”void PreOrderPrintLeaves(BinTree BT){ if (BT) { if (!BT->left && !BT->right) printf("%d",BT-&...转载 2019-04-29 21:56:04 · 140 阅读 · 0 评论 -
浙江大学数据结构(4.1.3二叉搜索树的删除)
考虑三种情况:要删除是的是叶结点:直接删除,并再修改其父结点指针——置为NULL 要删除的结点只有一个孩子结点:将其父结点的指针指向要删除节点的孩子结点 要删除的结点有左、右两棵子树:用另一结点替代被删除结点:右子树的最小元素或者左子树的最大元素BinTree Delete(ElementType X,BinTree BST){ Posititon Tmp; if (...转载 2019-05-04 11:56:48 · 135 阅读 · 0 评论 -
浙江大学数据结构(小白专场:搜索树是否一样的判别)
如何判别序列3 2 4 1是否与树T一致?方法:在树T中按顺序搜索序列3 2 4 1中的每个数如果每次搜索所经过的结点在前面均出现过,则一致 否则(某次搜索中遇到前面未出现的结点),则不一致...转载 2019-05-10 21:46:00 · 159 阅读 · 0 评论 -
浙江大学数据结构(5.2.2哈夫曼树的构造)
哈夫曼树的构造每次把权值最小的两棵二叉树合并// 建立哈夫曼树的结构体typedef struct TreeNode *HuffmanTree;struct TreeNode{ int Weight; Huffman Tree Left,Right;}// 建立哈夫曼树Huffman Tree Huffman(MaxHeap H){ int i; ...转载 2019-05-15 20:06:27 · 514 阅读 · 0 评论 -
python63(单例06—初始化动作只执行一次)
只执行一次初始化工作在每次使用类名()创建对象时,Python的解释器会自动调用两个方法:__new__分配空间 __init__对象初始化对__new__方法改造之后,每次都会得到第一次被创建对象的引用 但是:初始化方法还会被再次调用需求让初始化动作只被执行一次解决办法定义一个类属性init_flag标记是否执行过初始化动作,初始值为False 在__init方法中,判...转载 2019-05-20 23:17:40 · 635 阅读 · 0 评论 -
二叉树的遍历问题
递归算法先序遍历// 递归先序遍历Status PreOrderTraverse(BiTree T) { if (T==NULL) return OK; printf("%d\n",T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild);} 中序遍历// 递归中...原创 2019-08-09 18:21:37 · 212 阅读 · 0 评论 -
浙江大学数据结构(7.1.3有权图的单源最短路)
有权图的单源最短路算法按照递增的顺序找出到各个顶点的最短路Dijkstra算法令S={源点s+已经确定了最短路径的顶点Vi} 对任一未收录的顶点v,定义dist[v]为s到v的最短路径长度,但该路径仅经过S中的顶点。即路径{S——>(vi属于S)——>v}的最小长度 若路径是按照递增的顺序生成的,则真正的最短路必须只经过S中的顶点(为什么?) 每次从未收录的顶点中选一...转载 2019-05-24 11:17:22 · 160 阅读 · 0 评论 -
浙江大学数据结构(7.1.2无权图的单源最短路)
无权图的单源最短路算法按照递增的顺序找到各个顶点的最短路dist[W]= S到W的最短距离dist[S]=0path[W]= S到W的路上经过的某顶点void Unweighted(Vertex S){ Enqueue(S,Q); while (!IsEmpty(Q)) { V=Dequeue(Q); for (V的每个...转载 2019-05-23 21:04:45 · 195 阅读 · 0 评论 -
浙江大学数据结构(7.1.1概述)
最短路径问题给两个站点A和B,求A到B的最短路(把权重定为距离) A到B最便宜的路(把权重定为价格) A到B经过站点最少(关心经过路径的数量,与权重无关)最短路径问题的抽象在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径 这条路径就是两点之间的最短路径 第一个顶点为源点(Source) 最后一个顶点为终点(Destination)问题分类单源最短路径...转载 2019-05-23 19:30:52 · 141 阅读 · 0 评论 -
浙江大学数据结构(8.1.1Prim算法)
最小生成树问题什么是最小生成树(Minimum Spanning Tree)是一棵树无回路 |V|个顶点有|V|-1条边是生成树包含全部顶点 |V|-1条边都在图里 不唯一,向生成树中任加一条边都一定构成回路边的权重和最小最小生成树存在等价于图连通贪心算法(Greedy)什么是“贪”:每一步都要最好的 什么是“好”:权重最小的边 需要约束:只能用图里有的边 ...转载 2019-05-27 16:28:30 · 165 阅读 · 0 评论 -
浙江大学数据结构(7.1.4多源最短路算法)
方法1:直接将单源最短路算法调用V遍方法2:Floyd算法T=O(|V|^3)——对于稠密图效果好Floyd算法Dk[i][j]=路径{i——>{l<=k}——>j}的最小长度 D0,D1,...,D|v|-1[i][j]即给出了i到j的真正最短距离 最初D-1是什么?邻接矩阵即可有邻接边定义为权重 无邻接边定义为inf当Dk-1已经完成,递推到Dk时:...转载 2019-05-26 15:23:04 · 139 阅读 · 0 评论 -
浙江大学数据结构(小白—邻接矩阵表示的图—建立图)
LGraph初始化初始化一个有VertexNum个顶点但没有边的图typedef int Vertex;LGraph CreateGraph(int VertexNum){ Vertex V,W; LGraph Graph; Graph = (LGraph)malloc(sizeof(struct GNode)); Graph->Nv=Vertex...转载 2019-05-22 10:20:16 · 176 阅读 · 0 评论 -
浙江大学数据结构(小白—邻接矩阵表示的图结点的结构)
用邻接表表示图邻接表:G[N]为指针数组,对应矩阵每行一个链表,只存非0元素typedef struct GNode *PtrToGNode;struct GNode { int Nv; int Ne; AdjList G;};typedef PtrToNode LGraph;typedef struct VNode{ PtrToAdjVNo...转载 2019-05-22 10:06:54 · 144 阅读 · 0 评论 -
浙江大学数据结构(小白—邻接矩阵表示的图—建立图)
MGraph BuildGraph(){ MGraph Graph; Edge E; Vertex V; int Nv,i; scanf("%d",&Nv); Graph=CreateGraph(Nv); scanf("%d",&Graph->Ne); if (Graph->Ne!=0) ...转载 2019-05-22 09:52:36 · 151 阅读 · 0 评论 -
浙江大学数据结构(小白—邻接矩阵表示的图—插入边)
typedef struct ENode* PtrToENode;struct ENode{ Vertex v1,v2; WeightType Weight; // 权重}void InsertEdge(MGraph Graph,Edge E){ // 单向图只需插入一次 Graph->G[E->v1][E->v2]=E->...转载 2019-05-22 09:26:02 · 536 阅读 · 0 评论 -
浙江大学数据结构(小白—邻接矩阵表示的图—初始化)
初始化一个有VertexNum个顶点但没有边的图typedef int Vertex;MGraph CreateGraph(int VertexNum){ Vertex V,W; MGraph Graph; Graph = (MGraph)malloc(sizeof(struct GNode)); Graph->Nv=VertexNum; Gr...转载 2019-05-22 09:18:40 · 976 阅读 · 0 评论 -
浙江大学数据结构(小白—邻接矩阵表示图结点的结构)
小白专场:如何建立图?用邻接矩阵表示G[i][j]=1(若<vi,vj>是G中的边) 0(Otherwise)typedef struct GNode* PtrToNode;{int Nv; // 顶点数int Ne; // 边数int G[MaxVertex][MaxVertex];DataType Data[MaxVertex]; // 存放节点数...转载 2019-05-22 09:10:45 · 158 阅读 · 0 评论 -
浙江大学数据结构(6.4应用实例:六度空间)
你和任何一个陌生人之间所间隔的人不会超过六个问题:给定社交网络图,请对每个节点计算符合“六度空间”理论占结点总数的百分比算法思路:对每个结点,进行广度优先搜索 搜索过程中累计访问的结点数 需要记录层数,仅计算6层以内的结点数...转载 2019-05-22 08:50:05 · 866 阅读 · 0 评论 -
浙江大学数据结构(5.2.3哈夫曼编码)
给定一段字符串,如何对字符进行编码,可以使得该字符串的编码存储空间最小?【例】假设有一段文本,包含58个字符,并由以下7个字符构成:a,e,i,s,t,空格,换行;这7个字符出现的次数不同。如何对这7个字符进行编码,使得总编码空间最少?【分析】用等长的ASCII编码:58*8=464位 用等长3位编码:58*3=174位 不等长编码:出现频率高的字符用的编码短些,出现频率低的字符则...转载 2019-05-16 18:36:01 · 513 阅读 · 0 评论 -
浙江大学数据结构(6.2.4图的遍历—图不连通怎么办)
连通:如果从V到W存在一条(无向)路径,则称V和W是连通的 路径:V到W的路径是一系列顶点{V,v1,v2,...,vn,W}的集合,其中任一对相邻的顶点间都有图中的边。路径的长度是路径中的边数(如果带权,则是所有边的权重和)。如果V到W之间的所有顶点都不同,则称简单路径 回路:起点等于终点的路径 连通图:图中任意两顶点均连通 连通分量:无向图的极大连通子图极大顶点数:再加1个顶点就不连...转载 2019-05-21 12:22:37 · 319 阅读 · 0 评论 -
浙江大学数据结构(6.2.3图的遍历—为什么需要两种遍历)
大侠走迷宫演示转载 2019-05-21 11:52:19 · 284 阅读 · 0 评论 -
浙江大学数据结构(4.1.2二叉搜索树的插入)
【分析】关键是要找到元素应该插入的位置,可以采用Find类似的方法BinTree Insert(ElementType X,BinTree BST){ if (!BST) { BST=malloc(sizeof(struct TreeNode)) BST->Data=X; BST->Left=BST-...转载 2019-05-03 20:40:21 · 163 阅读 · 0 评论 -
浙江大学数据结构(4.1二叉搜索树)
查找问题:静态查找(只有查找操作)与动态查找(查找、插入、删除操作) 针对动态查找,数据如何组织?什么是二叉搜索树?二叉搜索树(Binary Search Tree),也称二叉排序树或二叉查找树二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:非空左子树的所有键值小于其根结点的键值。 非空右子树的所有键值大于其根结点的键值。 左、右子树都是二叉搜索树。二叉搜索树操...转载 2019-05-03 20:23:43 · 318 阅读 · 0 评论 -
浙江大学数据结构(小白专场:程序框架、建树及同构判别)
程序框架搭建int main(){ // 建二叉树1 // 建二叉树2 // 判别是否同构并输出 return 0; }需要设计的函数:读数据建二叉树 二叉树同构判别int main(){ Tree R1,R2; // 建二叉树1 R1=BuildTree(T1); // 建二叉树2 R2=Build...转载 2019-05-02 17:56:04 · 141 阅读 · 0 评论 -
浙江大学数据结构(2.2.2 堆栈的顺序存储实现)
堆栈的链式存储实现栈的链式存储结构实际上就是一个单链表,叫做链栈。插入和删除操作只能在链栈的栈顶进行Q:栈顶指针Top应该在链表的哪一头?插在链表表尾无法进行出栈操作,因为找不到上一个节点的地址。// 创建新的堆栈typedef struct SNode* Stack;struct SNode{ ElementType Data; struct SNode* Next;...转载 2019-03-20 23:11:33 · 199 阅读 · 0 评论