2019寧夏回族自治區資料結構考試加強

2022-03-18 14:23:40 字數 3160 閱讀 9452

1、對一般二叉樹,僅根據乙個先序、中序、後序遍歷,不能確定另乙個遍歷序列。但對於滿二叉樹,任一結點的左右子樹均含有數量相等的結點,根據此性質,可將任一遍歷序列轉為另一遍歷序列(即任一遍歷序列均可確定一棵二叉樹)。

void pretopost(elemtype pre ,post,int l1,h1,l2,h2)

//將滿二叉樹的先序序列轉為後序序列,l1,h1,l2,h2是序列初始和最後結點的下標。

}//pretopost

32. .葉子結點只有在遍歷中才能知道,這裡使用中序遞迴遍歷。

設定前驅結點指標pre,初始為空。第乙個葉子結點由指標head指向,遍歷到葉子結點時,就將它前驅的rchild指標指向它,最後葉子結點的rchild為空。

linkedlist head,pre=null; //全域性變數

linkedlist inorder(bitree bt)

//中序遍歷二叉樹bt,將葉子結點從左到右鏈成乙個單鏈表,表頭指標為head

//處理第乙個葉子結點

else //將葉子結點鏈入鍊錶

inorder(bt->rchild中序遍歷左子樹

pre->rchild=null設定鍊錶尾

}return(head); } //inorder

時間複雜度為o(n),輔助變數使用head和pre,棧空間複雜度o(n)

2、假設以鄰接矩陣作為圖的儲存結構,編寫演算法判別在給定的有向圖中是否存在乙個簡單有向迴路,若存在,則以頂點序列的方式輸出該迴路(找到一條即可)。(注:圖中不存在頂點到自己的弧)

有向圖判斷迴路要比無向圖複雜。利用深度優先遍歷,將頂點分成三類:未訪問;已訪問但其鄰接點未訪問完;已訪問且其鄰接點已訪問完。

下面用0,1,2表示這三種狀態。前面已提到,若dfs(v)結束前出現頂點u到v的回邊,則圖中必有包含頂點v和u的迴路。對應程式中v的狀態為1,而u是正訪問的頂點,若我們找出u的下一鄰接點的狀態為1,就可以輸出迴路了。

void print(int v,int start ) //輸出從頂點start開始的迴路。

//if

}//print

void dfs(int v)

//if

else

visited[v]=2;

}//dfs

void find_cycle() //判斷是否有迴路,有則輸出鄰接矩陣。visited陣列為全域性變數。

//find_cycle

3、給出折半查詢的遞迴演算法,並給出演算法時間複雜度性分析。

4、 連通圖的生成樹包括圖中的全部n個頂點和足以使圖連通的n-1條邊,最小生成樹是邊上權值之和最小的生成樹。故可按權值從大到小對邊進行排序,然後從大到小將邊刪除。每刪除一條當前權值最大的邊後,就去測試圖是否仍連通,若不再連通,則將該邊恢復。

若仍連通,繼續向下刪;直到剩n-1條邊為止。

void spntree (adjlist g)

//用「破圈法」求解帶權連通無向圖的一棵最小代價生成樹。

node; //設頂點資訊就是頂點編號,權是整型數

node edge;

scanf( "%d%d",&e,&n) ; //輸入邊數和頂點數。

for (i=1;i<=e;i輸入e條邊:頂點,權值。

scanf("%d%d%d" ,&edge[i].i ,&edge[i].j ,&edge[i].w);

for (i=2;i<=e;i++) //按邊上的權值大小,對邊進行逆序排序。

//for

k=1; eg=e;

while (eg>=n破圈,直到邊數e=n-1.

if (connect(k)) //刪除第k條邊若仍連通。

edge[k].w=0; eg--; }//測試下一條邊edge[k],權值置0表示該邊被刪除

k++; //下條邊

while

}//演算法結束。

connect()是測試圖是否連通的函式,可用圖的遍歷實現,

5、設計乙個盡可能的高效演算法輸出單鏈表的倒數第k個元素。

6、給定n個村莊之間的交通圖,若村莊i和j之間有道路,則將頂點i和j用邊連線,邊上的wij表示這條道路的長度,現在要從這n個村莊中選擇乙個村莊建一所醫院,問這所醫院應建在哪個村莊,才能使離醫院最遠的村莊到醫院的路程最短?試設計乙個解答上述問題的演算法,並應用該演算法解答如圖所示的例項。20分

void hospital(adjmatrix w,int n)

//在以鄰接帶權矩陣表示的n個村莊中,求醫院建在何處,使離醫院最遠的村莊到醫院的路徑最短。

//在最長路徑中,取最短的一條。m記最長路徑,k記出發頂點的下標。

printf(「醫院應建在%d村莊,到醫院距離為%d\n」,i,m);

for}//演算法結束

對以上例項模擬的過程略。各行中最大數依次是9,9,6,7,9,9。這幾個最大數中最小者為6,故醫院應建在第三個村莊中,離醫院最遠的村莊到醫院的距離是6。

1、對圖1所示的連通網g,請用prim演算法構造其最小生成樹(每選取一條邊畫乙個圖)。

7、設t是一棵滿二叉樹,編寫乙個將t的先序遍歷序列轉換為後序遍歷序列的遞迴演算法。

8、二路插入排序是將待排關鍵字序列r[1..n]中關鍵字分二路分別按序插入到輔助向量d[1..n]前半部和後半部(注:

向量d可視為迴圈表),其原則為,先將r[l]賦給d[1],再從r[2] 記錄開始分二路插入。編寫實現二路插入排序演算法。

9、有一種簡單的排序演算法,叫做計數排序(count sorting)。這種排序演算法對乙個待排序的表(用陣列表示)進行排序,並將排序結果存放到另乙個新的表中。必須注意的是,表中所有待排序的關鍵碼互不相同,計數排序演算法針對表中的每個記錄,掃瞄待排序的表一趟,統計表中有多少個記錄的關鍵碼比該記錄的關鍵碼小,假設針對某乙個記錄,統計出的計數值為c,那麼,這個記錄在新的有序表中的合適的存放位置即為c。

(1) (3分)給出適用於計數排序的資料表定義;

(2) (7分)使用pascal或c語言編寫實現計數排序的演算法;

(3) (4分)對於有n個記錄的表,關鍵碼比較次數是多少?

(4) (3分)與簡單選擇排序相比較,這種方法是否更好?為什麼?

10、若第n件物品能放入揹包,則問題變為能否再從n-1件物品中選出若干件放入揹包(這時揹包可放入物品的重量變為s-w[n])。若第n件物品不能放入揹包,則考慮從n-1件物品選若干件放入揹包(這時揹包可放入物品仍為s)。若最終s=0,則有一解;否則,若s<0或雖然s>0但物品數n<1,則無解。

2019寧夏回族自治區資料結構分析入門

1 請設計乙個演算法,要求該演算法把二叉樹的葉子結點按從左到右的順序連成乙個單鏈表,表頭指標為head。二叉樹按二叉鍊錶方式儲存,鏈結時用葉子結點的右指標域來存放單鏈表指標。分析你的演算法的時 空複雜度。2 給出折半查詢的遞迴演算法,並給出演算法時間複雜度性分析。3 對一般二叉樹,僅根據乙個先序 中...

2023年寧夏回族自治區資料總結摘要

1 define maxsize 棧空間容量 void inouts int s maxsize s是元素為整數的棧,本演算法進行入棧和退棧操作。else s top x x入棧 else 讀入的整數等於 1時退棧。else printf 出棧元素是 d n s top 演算法結 2 給出折半查詢的...

2023年寧夏回族自治區資料總結綱要

1 後序遍歷最後訪問根結點,即在遞迴演算法中,根是壓在棧底的。採用後序非遞迴演算法,棧中存放二叉樹結點的指標,當訪問到某結點時,棧中所有元素均為該結點的祖先。本題要找p和q 的最近共同祖先結點r 不失一般性,設p在q的左邊。後序遍歷必然先遍歷到結點p,棧中元素均為p的祖先。將棧拷入另一輔助棧中。再繼...