当前位置:首页 » 操作系统 » 树算法题

树算法题

发布时间: 2023-09-06 03:29:31

Ⅰ 数据结构算法 试题 急! 试构造下图的最小生成树,要求分步给出构造过程。

图有如下参数:

边数=8顶点数=5

顶点顶点边的权值
v1v26
v1v34
v1v42
v2v35
v2v48
v2v56
v3v45
v4v57

用Kruskal(克鲁斯卡尔)算法,求最小生成树.

先将所有边的权值按照从小到大排序:

顶点顶点边的权值
v1v42
v1v34
v2v35
v3v45
v1v26
v2v56
v4v57
v2v48

然后,每次提取权值最小边,逐步组成最小生成树:

(1)取最小边(v1,v4,2)

v1--v4

(2)取边(v1,v3,4),不会产生环路.

v1--v4
|
|
v3

(3)取边(v2,v3,5),不会产生环路.

v1--v4
|
|
v3--v2

(4)如果取边(v3,v4,5),会产生环路,所以不能取.
如果取边(v1,v2,6),会产生环路,所以不能取.
取边(v2,v5,6),不会产生环路.

v1--v4
|
|
v3--v2--v5

这就是最小生成树,连通了所有顶点,总权值最小.

顶点边的权值
(v1,v4)2
(v1,v3)4
(v2,v3)5
(v2,v5)6


//C语言测试程序

//最小生成树Kruskal(克鲁斯卡尔)算法
#include"stdio.h"

#defineMAXEDGE20
#defineMAXVEX20
#defineINF65535

typedefstruct
{
intarc[MAXVEX][MAXVEX];
intnumVertexes,numEdges;
}MGraph;

typedefstruct
{
intbegin;
intend;
intweight;
}Edge;//对边集数组Edge结构的定义

//创建图
voidCreateMGraph(MGraph*G)
{
inti,j;

G->numEdges=8;//边数
G->numVertexes=5;//顶点数

for(i=0;i<G->numVertexes;i++)//初始化图
{
for(j=0;j<G->numVertexes;j++)
{
if(i==j)
G->arc[i][j]=0;
else
G->arc[i][j]=G->arc[j][i]=INF;
}
}

G->arc[0][1]=6;
G->arc[0][2]=4;
G->arc[0][3]=2;
G->arc[1][2]=5;
G->arc[1][3]=8;
G->arc[1][4]=6;
G->arc[2][3]=5;
G->arc[3][4]=7;

for(i=0;i<G->numVertexes;i++)
{
for(j=i;j<G->numVertexes;j++)
{
G->arc[j][i]=G->arc[i][j];
}
}
}

//交换权值以及头和尾
voidSwapn(Edge*edges,inti,intj)
{
inttemp;
temp=edges[i].begin;
edges[i].begin=edges[j].begin;
edges[j].begin=temp;
temp=edges[i].end;
edges[i].end=edges[j].end;
edges[j].end=temp;
temp=edges[i].weight;
edges[i].weight=edges[j].weight;
edges[j].weight=temp;
}

//对权值进行排序(选择排序法)
voidsort(Edgeedges[],MGraph*G)
{
inti,j,min;
for(i=0;i<(G->numEdges-1);i++)
{
min=i;
for(j=i+1;j<G->numEdges;j++)
{
if(edges[min].weight>edges[j].weight)
{
min=j;
}
}
if(i!=min)
{
Swapn(edges,i,min);
}
}

printf("边的权值排序之后: ");
for(i=0;i<G->numEdges;i++)
{
printf("(%d,%d)%d ",edges[i].begin,edges[i].end,edges[i].weight);
}
}

//查找连线顶点的尾部下标
intFind(int*parent,intf)
{
while(parent[f]>0)
{
f=parent[f];
}
returnf;
}

//生成最小生成树
voidMiniSpanTree_Kruskal(MGraphG)
{
inti,j,n,m;
intk=0;
intparent[MAXVEX];//定义一数组用来判断边与边是否形成环路

Edgeedges[MAXEDGE];//定义边集数组,edge的结构为begin,end,weight,均为整型

//用来构建边集数组并排序
for(i=0;i<G.numVertexes-1;i++)
{
for(j=i+1;j<G.numVertexes;j++)
{
if(G.arc[i][j]<INF)
{
edges[k].begin=i;
edges[k].end=j;
edges[k].weight=G.arc[i][j];
k++;
}
}
}
sort(edges,&G);//从小到大排序

for(i=0;i<G.numVertexes;i++)
{
parent[i]=0;
}

printf("打印最小生成树: ");
for(i=0;i<G.numEdges;i++) //循环每一条边
{
n=Find(parent,edges[i].begin);
m=Find(parent,edges[i].end);
if(n!=m)//假如n与m不等,说明此边没有与现有的生成树形成环路
{
parent[n]=m; //将此边的结尾顶点放入下标为起点的parent中
//表示此顶点已经在生成树集合中
printf("(%d,%d)%d ",edges[i].begin,edges[i].end,edges[i].weight);
}
}
}

intmain(void)
{
MGraphG;
CreateMGraph(&G);
MiniSpanTree_Kruskal(G);
return0;
}

Ⅱ 题目3. 平衡二叉树算法查找树中某节点的时间复杂度是多少

平均查找的时间复杂度为O(log n)。

平衡树的查找过程和排序树的相同。在查找过程中和给定值进行比较关键字个数不超过树的深度。

如果二叉树的元素个数为n,那么不管是对树进行插入节点、查找、删除节点都是log(n)次循环调用就可以了。它的时间复杂度相对于其他数据结构如数组等是最优的。

是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。常用算法有红黑树、AVL、Treap、伸展树等。

(2)树算法题扩展阅读:

二叉树也是递归定义的,其结点有左右子树之分,逻辑上二叉树算法有五种基本形态:

(1)空二叉树——(a)

(2)只有一个根结点的二叉树——(b);

(3)右子树为空的二叉树——(c);

(4)左子树为空的二叉树——(d);

(5)完全二叉树——(e)

注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。

Ⅲ 设计计算二叉树中所有节点值之和的算法

设计计算二叉树中所有节点值之和的算法。

如下参考:

1.首先定义两个类:节点类和二叉树类,如下图所示。

热点内容
安卓照片加胡子是什么软件 发布:2025-01-31 11:20:03 浏览:907
创建数据库并设置编码 发布:2025-01-31 11:11:52 浏览:781
搭建数据中心需要的服务器配置 发布:2025-01-31 11:11:44 浏览:590
c语言小数点后四舍五入 发布:2025-01-31 11:10:10 浏览:496
httpslinux 发布:2025-01-31 11:10:09 浏览:828
java4 发布:2025-01-31 11:08:42 浏览:355
什么是密码屏蔽 发布:2025-01-31 11:05:13 浏览:216
一个算法的效率可分为 发布:2025-01-31 11:05:12 浏览:639
win7用户名密码是什么 发布:2025-01-31 10:57:38 浏览:394
网址端口访问 发布:2025-01-31 10:49:30 浏览:512