
数据结构2021
LIUDAN'S WORLD
这个作者很懒,什么都没留下…
展开
-
最小代价生成树
1. Prim算法 建立两个数组,vset[]和lowcost[]。 vset[i] = 1 表示顶点i已经并入生成树中,vset[i] = 0 表示顶点i未并入生成树中。lowcost[]存放当前生成树到剩余各顶点最短边的权值——是树的这一整体到其余顶点的权值,而非针对树中某一顶点。 执行过程: 从树中某一顶点v0开始: 1)将v0到其他顶点的所有边当作候选边; 2)重复以下步骤...原创 2021-08-15 15:53:36 · 581 阅读 · 0 评论 -
图以邻接表表示,输出从顶点i到顶点j的所有简单路径
void FindPath(AGraph *G,int u,int v,int path[],int d){ int w,i; ArcNode *p; d++; path[d]=u; visited[u]=1; if(u==v) print(path[]); p=G->adjlist[u].firstarc; while(p!=NULL){ w=p->adjvex;//w未访问,递归访问它 .原创 2021-08-13 10:57:22 · 3051 阅读 · 1 评论 -
分别采用深度和广度优先遍历算法判别以邻接表形式存储的有向图中是否存在由顶点i到顶点j的路径。
对于两个不同的算法,均采用从顶点i出发,依次遍历每个顶点,直到搜索到顶点j,则说明存在。int visited[Maxsize]={0};int Exist_Path_DFS(ALGraph G,int i,int j){ int p; //有则返回1,没有则返回0 if(i==j){ return 1; } else{ visited[i]=1; for(p=FirstNeighbor(G,i);p>=0原创 2021-08-13 10:47:35 · 3927 阅读 · 7 评论 -
图的深度优先遍历的非递归算法(采用邻接表形式)
思路: 需要一个栈S,记忆下一次访问的顶点。 使用访问标记数组visited[],标记第i各顶点是否在栈内或曾经在栈内。若曾经在栈内,则不能再进栈。void DFS_NON_RC(AGraph &G,int v){ int w; InitStack(s); for(i=0;i<G.vexnum;i++){ visited[i]=FALSE; } Push(S,v); visited[v]=...原创 2021-08-12 12:09:10 · 1653 阅读 · 2 评论 -
判断一个无向图是否为树
无向图:每条边没有方向思路: 一个无向图是一棵树的条件是:G必须是无回路的连通图或者有n-1条边的连通图。 对连通的判定:用能否全部遍历所有顶点来实现。 本算法中采用深度优先搜索算法在遍历图的过程中统计可能访问到的顶点个数和边的条数。若一次就遍历访问到N个顶点和n-1条边。则为一棵树。bool isTree(Graph &G){ for(i=1;i<G.vexnum;i++) visited[i]=FALSE; ...原创 2021-08-12 11:57:59 · 4209 阅读 · 2 评论 -
图的遍历操作
1.广度优先遍历BFS 类似于树的层次遍历。需要一个辅助队列。 王道版本:bool visited[MAX_VERTEX_NUM];void BFSTraverse(Graph G){ int i=0; for(i=0;i<G.vexnum;++i){ visited[i]=FALSE;//访问数组初始化 } InitQueue(Q); for(i=0;i<G.vexnum;++i) ...原创 2021-08-12 11:37:25 · 361 阅读 · 0 评论 -
将图的邻接表表示转换成邻接矩阵表示的算法
设图的顶点分别存储在v[n]数组中,首先初始化邻接矩阵。遍历邻接表,在依次遍历顶点v[i]的边链表时,修改邻接矩阵的第i行的元素值。若链表边结点的值为j,则置arcs[i][j]=1。遍历完邻接表时,整个转换结束void Convert(ALGraph &G,int arcs[M][N]){ int i=0; for(i=0;i<n;i++){//依次遍历各顶点表为头的边链表 p=(G->v[i]).firstarc;//取出顶点i的...原创 2021-08-12 10:01:50 · 2511 阅读 · 0 评论 -
图的存储结构
1.图的邻接矩阵存储结构#define MaxVertexNum 100 //顶点最大数目typedef char VertexType //顶点的数据类型typedef int EdgeType //带权图中边上权值的数据类型typedef struct{ VertexType Vex[MaxVertexNum]; //顶点表 EdgeType Edge[MaxVertexNum][MaxVertexNum]; //边表 int vexnum,arcn原创 2021-08-12 09:52:19 · 267 阅读 · 0 评论 -
树与二叉树总结
1.递归遍历程序void Track(BiTree *p){ if(p!=NULL){ //(1) Track(p->lchild); //(2) Track(p->rchild); //(3) }}访问函数visit位于 1 2 3的位置分别对应于先序、中序、后序遍历。2.非递归函数程序 先中后序的非递归都通过栈实现,层次遍历利用队列实现。 以下为后序遍历的非递归算法实现。typedef...原创 2021-08-11 22:29:23 · 100 阅读 · 0 评论 -
从大到小输出所有不小于k的关键字
右子树结点值均大于根结点的值。左子树的 值均小于根结点的值。从大到小输出,则先遍历右子树,再访问根结点,后遍历左子树。void outPut(BSTNode *bt,KeyType k){ if(bt==NULL){ return; } if(bt->rchild!=NULL) outPut(bt->rchild,k); if(bt->data > k){ printf(" %d",bt-&原创 2021-08-11 21:30:22 · 451 阅读 · 1 评论 -
求出给定二叉排序树的最小值和最大值
KeyType MinKey)(BSTNode *bt){ while(bt->lchild!=NULL){ bt=bt->lchild; } return bt->data;}KeyType MaxKey)(BSTNode *bt){ while(bt->rchild!=NULL){ bt=bt->rchild; } return bt->data;}原创 2021-08-11 21:22:06 · 752 阅读 · 0 评论 -
判断给定二叉树是否是平衡二叉树
设二叉树的平衡标记balance,以标记返回二叉树bt是否是平衡二叉树。是返回1否则为0.h为bt的高度。 采用后序遍历递归算法: 1)bt为空,高度0,balance=1; 2)仅有根结点,高度1,balance=1; 3)对bt左右子树执行递归,返回 其高度及平衡标记。bt高度为最高子树高度加1。左右子树高度差大于1,balance=0;小于1,且左右均平衡时,balance=1,否则为0;void Judge_AVL(B...原创 2021-08-11 21:16:00 · 285 阅读 · 0 评论 -
指定结点在二叉排序树中的层次
int level(BiTree bt,BSTNode *p){ int n=0;//counters BiTree t=bt; if(bt==NULL){ n++; while(t->data!=p->data); { if(p->data < t->data) t=t->lchild; else .原创 2021-08-11 20:57:49 · 1048 阅读 · 1 评论 -
判断给定的二叉树是否是二叉排序树
思路 二叉排序树的中序序列为递增有序序列。 对给定二叉树进行中序遍历,若前值比后值小,则为二叉排序树。KeyType predt=-32767;//保存当前结点中序前驱的值int JudgeBST(BiTree bt){ int b1,b2; if(bt==NULL){ return 1; }else { b1=JudgeBST(bt->lchild);//判断左子树 if(b...原创 2021-08-11 20:49:11 · 1877 阅读 · 2 评论 -
由树的层次序列及结点的度,构造此树的孩子-兄弟链表
思路 设置一个辅助数组pointer[],存储新树的各结点的地址,再由层次序列与结点的度,逐个链接点。#define maxNodes 15void createCStree_Degree(CSTree &T,DataType e[],int degree[],int n){ //层次序列e[],各结点的度degree[] //n 树结点个数 CSNode *pointer=new CSNode[maxNodes]; int i,j,d,k...原创 2021-08-11 20:39:06 · 534 阅读 · 0 评论 -
以孩子兄弟链表为存储结构。递归求树的深度
思路:采用递归算法。 1)若树空,高度0 2)非空,h为第一子女树高度加1和兄弟子树高度的最大者。 非递归算法使用队列,逐层遍历树,取得高度int Height(CSTree bt){ int hc,hs; if(bt==NULL) return 0; else{ hc=Height(bt->firstchild); hs=Height(bt->nextsibling); ...原创 2021-08-11 20:24:16 · 2940 阅读 · 1 评论 -
以孩子兄弟表示法存储结构的森林的叶子结点数
孩子兄弟表示法存储结构typedef struct CSNode{ ElemType data; struct CSNode *firstchild,*nextsibling;}CSNode,*CSTree;当森林以孩子兄弟表示法存储时。若结点无孩子,则为叶结点;总叶子结点个数是孩子上的叶子数和兄弟子树上叶子结点数之和。typedef struct node{ ElemType data; struct node *fch,*nsib;}*Tree;i原创 2021-08-09 22:23:17 · 1812 阅读 · 0 评论 -
将给定表达式(二叉树)转换为等价中缀表达式并输出
表达式树的中序序列加上必要的括号即为等价的中缀表达式。可基于中序遍历得出。void BtreeToE(BTree *root){ BtreeToExp(root,1);}void BtreeToExp(BTree root,int deep){ if(root ==NULL) return; else if(root->lchild == NULL && root->rchild == NULL){ printf("%s",roo原创 2021-08-09 22:07:25 · 1962 阅读 · 0 评论 -
求二叉树的带权路径长度
二叉树的带权路径长度: 每个叶结点的深度与权值之积德总和。方法:先序遍历或层次遍历结点类型定义:typedef struct BiTNode{ int weight; struct BiTNode *lchild,*rchild;}BiTNode,BiTree;基于先序:使用static 变量 wpl记录权值,每个结点的深度作为递归函数的参数传递。具体算法如下1)若是叶结点,wpl=wpl+该结点的深度与权值之积;2)非叶结点,若左子树不空,对左子树调用递归算原创 2021-08-09 21:55:06 · 4958 阅读 · 0 评论 -
满二叉树,已知先序序列pre,求后序序列post
#include <stdio.h>#define ElemType charvoid PretoPost(ElemType pre[],int l1,int h1,ElemType post[],int l2,int h2){ int half; if(h1>=l1){ post[h2]=pre[l1]; half=(h1-l1)/2; printf("l1+1 = %d,l1+half = %d,l2.原创 2021-08-09 21:20:46 · 510 阅读 · 0 评论