當前位置:首頁 » 操作系統 » 樹演算法題

樹演算法題

發布時間: 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 14:02:28 瀏覽:552
android倉庫管理系統 發布:2025-01-31 14:02:27 瀏覽:700
batsql語句 發布:2025-01-31 14:00:13 瀏覽:733
沈陽加密狗 發布:2025-01-31 13:54:58 瀏覽:705
聯想伺服器怎麼裝windows7 發布:2025-01-31 13:54:52 瀏覽:874
java二級考試歷年真題 發布:2025-01-31 13:50:31 瀏覽:171
編程一刻 發布:2025-01-31 13:36:44 瀏覽:585
編程小草出土 發布:2025-01-31 13:33:27 瀏覽:579
如何設置伺服器屏蔽你的ip 發布:2025-01-31 13:25:58 瀏覽:243
扣扣的獨立密碼是什麼密碼 發布:2025-01-31 13:23:42 瀏覽:132