數據結構ds答案

數據結構習題及答案

複習題

1.在下面的程序段的時間複雜度爲   O(m*n)                

for (int i=1;i<m;i++)

           for (int j=1;j<n;j++)

              a[i][j]=i*j;

2.棧中元素的進出原則是     先進後出     ,隊列中元素的進出原則   是     先進先出        

 3.設指針p指向單鏈表中結點A,指針s指向被插入的結點X,則在結點A的前面插入結點X時的操作序列爲:

1) s->next=_p->next(下一節點)________;2) p->next=s;3) t=p->data;

4) p->data=_s->data__________;5) s->data=t;

4.假設以行序爲主序存儲二維數組A=array[1..100,1..100],設每個數據元素佔2個存儲單元,基地址爲10,則LOC[6,6]=    1020        

5.表達式a*(b+c)-d/e的後綴表達式爲     abc+*de/-                。

6.設一棵完全二叉樹中有100個結點,則該二叉樹的深度爲__7________;若用二叉鏈表作爲該完全二叉樹的存儲結構,則共有______101_____個空指針域。

 7.設有向圖G的存儲結構用鄰接矩陣A來表示,則A中第i行中所有非零元素個數之和等於頂點i的___出度_____。

 8.利用逐點插入法(註釋:將首位元素作爲根,將比它小的放左邊,比他大的放右邊)建立序列(50,72,43,85,75,20,35,45,65,30)對應的二叉排序樹以後,查找元素20要進行   3  次元素間的比較。

 9.在活動圖中,節點表示項目中各個工作階段的里程碑,連接各個節點的邊表示活動,邊上的數字表示活動持續的時間。在右邊的活動圖中,從A到J的關鍵路徑長度是  49    ,從E開始的活動啓動的最早時間(註釋:從源點到頂點E的最長路徑長。 )是   13     

 10.設一組初始記錄關鍵字序列爲(20,18,22,16,30,19),則根據這些初始關鍵字序列建成的初始大根堆序列爲____________30,20,22,16,18,19____________。

 11.已知待散列的線性表爲(36,15,40,63,22),散列用的一維地址空間爲[0..6],假定選用的散列函數是H(K)= K mod 7,若發生衝突採用線性探查法處理,求出在查找每一個元素概率相等情況下的平均查找長度  8/5      

12.設某無向圖中頂點數和邊數分別爲n和e,所有頂點的度數之和爲d,則e=___d/2____。

13.設二維數組A[0..10,0..20]按行優先順序存儲,每個元素佔4個存儲單元,A[2,1]的存儲地址是1000,則A[5,6]的存儲地址是   1272     

14.在循環單鏈表La(La爲頭指針)中,指針p所指結點爲表尾的條件  p->next==La      

15.設s=’YOUARE STUDENT IT RIGHT OR WRONG’,順序執行下列操作:SubString(sub1,s,1,8);  SubString(sub2,s,20,5); StrCat(sub1,sub2); 則最後sub1的值爲:    YOU ARE RIGHT            。

16.順序存放的循環隊列的元素以數組A[m]存放,其頭尾指針分別爲front和rear,則當前隊列中的元素個數爲 (rear-front+m)%m         。隊滿的條件(rear+1)%n=front

17.算法分析考慮的兩個主要因素是    時間複雜性          空間複雜性     

18.若一棵二叉樹具有10個度爲2的結點,5個度爲1的結點,則度爲0的結點個數是   11    

19.若待排序序列中具有相同關鍵字的記錄在排好序後其相對位置發生了變化,則稱這種排序方法是   不穩定的         

20.爲了保證圖中的各頂點在遍歷過程中訪問且僅訪問一次,需要爲每個頂點設一個訪問標誌,因此要爲圖設置一      訪問標誌數組visit[n]      ,用於標示圖中每個頂點是否被訪問過。

二、單項選擇題

1.算法分析的兩個主要方面是(    )。

A.空間複雜性和時間複雜性       B.正確性和簡明性

C.可讀性和文檔性               D.數據複雜性和程序複雜性

2.以下與數據的存儲結構無關的術語是(   )。

A.順序隊列                     B.鏈表 

C.有序表                       D.鏈棧

3.以下數據結構中,(    )是非線性數據結構。

A.樹          B.字符串        C.隊列          D.棧

4.線性表若採用鏈式存儲結構時,要求內存中可用存儲單元的地址(    )。

A.必須是連續的                 B.部分地址必須是連續的

C.一定是不連續的               D.連續或不連續都可以

5.設輸入序列爲1、2、3,則通過棧的作用後不可以得到的輸出序列爲(    )。

A.3,1,2      B.3,2,1      C.1,3,2        D.1, 2,3

6.廣義表(a,(b,c))的表頭和表尾分別爲(    )。

A.a和(b,c)               B.(a)和(b,c)

C.a 和((b,c))             D.(a) 和((b,c))

7.棧和隊列的共同特點是(    )。(註釋:隊列是一種限定性的線性表,只允許表的一端插入元素,而另一端刪除元素

A.只允許在端點處插入和刪除元素

B.都是先進後出   

C.都是先進先出

D.沒有共同點 

8.下面程序段的時間複雜度爲(    )。

for (inti=1;i<n;i++)

     for (int j=1;j<m;j++)

         a[i][j]=0;

A.O(m2)       B.O(m*n)     C.O(n*n)     D.O(log2n)

9.在雙向循環鏈表中,在p指針所指的節點後插入q所指向的新節點,其修改指針的操作是(    )。

A.p->next=q;q->prior=p;p->next->prior=q;q->next=q;         

B.p->next=q;p->next->prior=q;q->prior=p;q->next=p->next;      

C.q->prior=p;q->next=p->next;p->next->prior=q;p->next=q;

D.q->prior=p;q->next=p->next;p->next=q;p->next->prior=q;

10.設一條單鏈表的頭指針變量爲head且該鏈表沒有頭結點,則其判空條件是(    )。

A.head==NULL                   B.head->next==NULL

C.head->next==head             D.head!=NULL

11.判定一個隊列Q(最多元素爲m)爲滿隊列的條件是(    )。

A.Q->rear-Q->front = = m       B.Q->rear-Q->front-1= = m 

C.Q->front = = Q->rear         D.Q->front == Q->rear+1

12.從未排序序列中挑選元素,並將其依次插入已排序序列(初始時爲空)一端的方法稱爲(    )。

A.歸併排序                        B.冒泡排序

C.插入排序                        D.選擇排序

13.若一組記錄的排序碼爲(46,79,56,38,40,84),則利用快速排序方法,以第一個記錄爲基準得到的一次劃分結果爲(    )。

A.38,40,46,56,79,84               B.40,38,46,79,56,84

C.40,38,46,56,79,84               D.40,38,46,84,56,79

14.串的長度是指(    )。

  A.串中所含不同字母的個數       B.串中所含字符的個數

  C.串中所含不同字符的個數       D.串中所含非空格字符的個數

15.設有一個10階的下三角矩陣A(包括對角線),按照從上到下、從左到右的順序存儲到連續的55個存儲單元中,每個數組元素佔1個字節的存儲空間,則A[5][4]=20地址與A[0][0]=1的地址之差爲(    )。

A.10             B19            C.28             D.55

16.在下述結論中,正確的是(    )。

只有一個結點的二叉樹的度爲0; 

②二叉樹的度爲2;

③二叉樹的左右子樹可任意交換;

④深度爲K的完全二叉樹結點個數小於或等於深度相同的滿二叉樹;

A.①②③         B.②③④         C.②④          D.①④

17.AVL樹是一種平衡的二叉排序樹,樹中任一結點的      

A.左、右子樹高度差的絕對值不超過1 

B.左、右子樹的高度均相同             

C.左子樹的高度均大於右子樹高度    

D.左子樹的高度均小於右子樹高度

18.若一棵二叉樹具有10個度爲2的結點,5個度爲1的結點,則度爲0的結點個數是(    )。

A.9              B.11             C.15            D.不確定

19.具有n個頂點的無向連通圖的生成樹至少應有(    )條邊。

A.n-1            B.n             C.n+1            D.n+2

20.一個有向圖用鄰接矩陣表示,要刪除所有從第i個頂點發出的邊,應該      

A.將鄰接矩陣的第i 行刪除  B.將鄰接矩陣的第 i 行元素全部置零

C.將鄰接矩陣的第i 列刪除  D.將鄰接矩陣的第 i 列元素全部置零

21.已知一棵完全二叉樹的第6層(設根爲第1層)有8個葉結點,則完全二叉樹的結點個數最多是      

A.39             B.52           C.111        D.119  

22.設有向無環圖G中的有向邊集合E={<1,2>,<2,3>,<3,4>,<1,4>},則下列屬於該有向圖G的一種拓撲排序序列的是(    )。

A.1,2,3,4                      B.2,3,4,1

C.1,4,2,3                      D.1,2,4,3

23.對n個元素的表做順序查找時,若查找每個元素的概率相同,則平均查找長度爲(    )。

A.(n-1)/2        B.n/2           C.(n+1)/2        D.n

24設某個棧的入棧序列是A,B,C,D,E,則下面4個選項中可能的出棧序列是    

A.ADBEC     BBCDEA     C.EBCAD     D.EABCD

25.廣義表(a,(b,c),d)的表頭和表尾(註釋:表尾一定是個表)分別爲      

   A.a和(b,c),d   B.(a)和(b,c),d    Ca和((b,c),d)   D.(a)和((b,c),d)

26.設有向圖的頂點個數爲n,則該圖是有向完全圖的條件是邊的條數滿足      

A.n (n-1)       Bn(n-1)/2     C.n(n+1)/2    D.n(n+1)

27.一個有n個頂點的無向連通圖的生成樹,其邊的條數爲      

A.n-1          B.n          C.n+1        D.nlogn

28.在線索化二叉樹中,t所指結點沒有左子樹的充要條件是      

A.t->lchild==NULL  B.t->ltag==1  C.t->ltag==0  D.以上都不對

29.下列四個序列中,哪一個是堆      

A.75,65,30,15,25,45,20,10           B.75,65,45,10,30,25,20,15

C.75,45,65,30,15,25,20,10           D.75,45,65,10,25,30,20,15

30.下列排序在一趟結束後不一定能選出一個元素放在其最終位置上的是      

A.選擇排序       B歸併排序     C.冒泡排序   D.快速排序

31.一組記錄的關鍵字爲46,79,56,38,40,84,利用快速排序的方法,以第一個記錄爲基準得到的一次劃分結果爲      

A.38,40,46,56,79,84         B.40,38,46,79,56,84

C40,38,46,56,79,84         D.40,38,46,84,56,79

 32.下列敘述中,不符合mB定義要求的是        

 A.根節點最多有m棵子樹             B所有葉結點都在同一層上  

C.各結點內關鍵字均升序或降序排列  D.葉結點之間通過指針鏈接  

、應用題

1.設某棵二叉樹的先序遍歷序列爲AB

DFCEGH,中序遍歷序列爲BFDAGEHC,要求畫出此二叉樹並給出該二叉樹的後序遍歷序列。FDBGHECA

2.設有無向連通網絡G如下圖所示

(1)畫出其鄰接矩陣存儲;

(2)從頂點①搜索所得的深度優先搜索(DFS)序列和廣度優先搜索(BFS)序列;

(3)請採用普里姆(加點法)或克魯斯卡爾算法(加邊法)畫出G的最小生成樹。

3.已知世界六大城市爲:北京(Pe)、紐約(N)、巴黎(Pa)、  倫敦(L) 、 東京(T) 、 墨西哥(M),下表給定了這六大城市之間的交通里程:

                        世界六大城市交通里程錶(單位:百公里)

                                                                                                                              

 

A

B

C

D

E

F

A

 

109

82

81

21

124

B

109

 

58

55

108

32

C

82

58

 

3

97

92

D

81

55

3

 

95

89

E

21

108

97

95

 

113

F

124

32

92

89

113

 


(1).畫出這六大城市的交通網絡圖;

(2).畫出該圖的鄰接表表示法;

(3).畫出該圖按權值遞增的順序來構造的最小(代價)生成樹.

 

4.已知某系統在通信聯絡中只可能出現4種字符:a,b,c,d,其概率分別爲1,3,5,7。要求:

 (1) 畫出對應的哈夫曼樹(要求左子樹根結點的權小於等於右子樹根結點的權) 。1

 (2)爲這4個字符設計哈夫曼編碼(要求左分支爲0,右分支爲1)。

     (3)計算該哈夫曼樹的最小加權路徑長度WPL。

  

5.已知某系統在通信聯絡中只可能出現8種字符a,b,c,d,e,f,g,h,其概率分別爲5,25,3,6,10,11,36,4。要求:

(1) 畫出對應的哈夫曼樹(要求左子樹根結點的權值小於等於右子樹根結點的權值) 。

(2)爲8個字符設計哈夫曼編碼(規定左子樹編碼爲0,右子樹編碼爲1)。

(3)計算該哈夫曼樹的最小加權路徑長度WPL。

f

 

6.已知一個二叉樹的順序存儲結構圖如下:

   (1)請畫出該二叉樹;   (2)寫出該二叉樹先序、中序遍歷序列;

   (3)將其轉化成等價的樹或森林。

 

下標

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

結點

A

B

C

D

E

 

F

 

 

G

H

 

 

I

J

7.已知一有向網的鄰接矩陣如下,如需在其中一個結點建立娛樂中心,要求該結點距其它各結點的最長往返路程最短,相同條件下總的往返路程越短越好,問娛樂中心應選址何處?給出解題過程。

 

8.AOE網可用來估算工程的完成時間,圖3是某項工程AOE網的鄰接表表示(V1地址爲1),其中表結點第一個域爲頂點,第二個域爲權值。頂點V i表示事件,數字i表示事件的編號,邊的數字(權值)表示活動所需的天數,求:

(1)分別畫出此項工程對應的鄰接矩陣和AOE網。

(2)以頂點V1出發廣度遍歷圖G(鄰接表表示)所得的頂點序列。

(3)給出圖G的一個拓撲排序序列。

(4)計算此項工程各事件(頂點)的ve(vi)和vl(vi)的函數值,各活動弧的e(ai)和l(ai)的函數值,即各事件和各活動弧的最早開始時間和最遲開始時間?

(5)根據計算結果確定此工程的關鍵路徑及完成此工程的工期(即所需的最少天數)?

9.給定一組關鍵字序列(SUN,MON,TUE,WED,THU,FRI,SAT),建立一個長度爲10的哈希表,哈希函數爲H(K)=(K中第一個字母在字母表中的序號)%7。要求:,並計算:對以下

(1)分別用線性探測和鏈地址兩種方法處理衝突,畫出所對應構造的哈希表(散列表)。

(2)設每個記錄的查找概率相等,分析並計算在以上兩種處理衝突方法所構造的哈希表中進行查找時,查找成功的平均查找長度(ASLsucc)以及查找不成功的平均查找長度(ASLunsucc)。

10.將關鍵字序列(7,8,30,11,18,9,14),散列存儲到散列表中,散列表的存儲空間是一個下標從0開始的一個一維數組,散列函數爲H(Key)=(Key×3) % P。處理衝突採用線性探測再散列法,已知裝填因子爲0.7。要求:

(1)畫出所構造的散列表(哈希表)。

(2)分別計算等概率情況下,查找成功和查找不成功的平均查找長度。T的取值,見教材P05,設表長爲m則T爲小於等於表長的最大素數,哈希表長=哈希表中填入元素個數/裝填因子=7/0.7=10,這裏T=7, 裝填因子a=哈希表中填入元素個數/哈希表長度

解:哈希表長度=哈希表中填入元素個數/裝填因子=7/0.7=10

因T哈希函數H(Key)=(Key*3)ModT,這裏T 應爲小於等於表長的最大素數(見教材P305)所以T應爲7,即哈希函數爲H(Key)=(Key*3)%7

(1)  構造的散列表爲

0

1

2

3

4

5

6

7

8

9

7

14

 

8

 

11

30

18

9

 

    1                       2                                        1                 1        1            3              3    

H(7)=(7*3)%7=0

H(8)=(8*3)%7=3

H(30)=(30*3)%7=6

.H(11)=(11*3)%7=5

H(18)=(18*3)%7=5(11衝突,往後找空位置存放,在7)

H(9)=(9*3)%7=6(與30衝突,往後找空位置存放,在8

H(14)=(14*3)%7=0(7衝突,往後找空位置存放,在2)

ALSsucc=(1+2+1+1+1+3+3)/7=12/7

ALSunsucc=(3+2+1+2+1+5+4)/7=18/7

 

四、算法分析與設計題

1.下面程序段的功能實現數據x進棧,要求在下劃線處填上正確的語句。

typedef struct {int s[100]; int top;} sqstack;

void push(sqstack &stack,int x)

{  if (stack.top==m-1)printf(“overflow”);

else {_____stack.s[stack.top]=x_______________;

_______stack.top++__________;}

}

2.二叉搜索樹的查找——遞歸算法:

boolFind(BTreeNode* BST,ElemType &item)

{

if (BST==NULL)

return false; //查找失敗

else {

if (item==BST->data){

item=BST->data;//查找成功

return  _ture__________;}

else if(item<BST->data)

return  Find(___BST->lchild___________,item);

else  return Find(____BST->Rchild___________,item);

 }//if

}

3.下面程序段的功能是實現二分查找算法,請在下劃線處填上正確的語句。

structrecord{int key; int others;};

intbisearch(struct record r[ ], int k)

{intlow=0,mid,high=n-1;

while(low<=high)

{

  ________mid=(low+high)/2________________________;

  if(r[mid].key==k) return(mid+1);

else if(___r[mid].key>k _________)  high=mid-1;

elselow=mid+1;}

  return(0);  }

4.下面是一趟快速排序的算法,待排序記錄存放在記錄數組r中,請在橫線上填空,把算法補充完整。

int  QKPass(RecordType r[], int low, int high)

{ x= r[low];            /* 選擇基準記錄*/ 

 while ( low<high )

{ while (low< high && r[high].key>=x.key )//從右到左找到小於//x.key的數

       high--; 

      if(low <high) {

         r[low]=r[high]         

     low++;}

     

while (low<high&& r[low].key<x.key  )

       low++; 

  if ( low<high ) {    r[high]=r[low]             ; high--;}

}

r[low]=x;     /*將基準記錄保存到low=high的位置*/

return low;      /*返回基準記錄的位置*/

 } /* QKPass */

5.(1) 將兩個非遞減的有序鏈表合併爲一個非遞增的有序鏈表。要求結果鏈表仍使用原來兩個鏈表的存儲空間, 不另外佔用其它的存儲空間。表中允許有重複的數據。

void union(LinkList& La, LinkList& Lb, LinkList& Lc, ) {

  pa = La->next;  pb = Lb->next;              // 初始化

  Lc=pc=La; //用La的頭結點作爲Lc的頭結點

  Lc->next = NULL;

  while ( pa || pb ) {

     if  ( !pa ) { q = pb;  pb = pb->next; }

     else if  ( !pb ) { q = pa;  pa = pa->next; }

     else if (pa->data<= pb->data ) 

     { q =pa;

 pa =pa->next;

 }

     else  { q = pb;

 pb =pb->next;

 }

     q->next = Lc->next;

  Lc->next =q;    // 插入

  }

  delete Lb;             //釋放Lb的頭結點}  

 

(2)設計算法將一個帶頭結點的單鏈表A分解爲兩個具有相同結構的鏈表B、C,其中B表的結點爲A表中值小於零的結點,而C表的結點爲A表中值大於零的結點(鏈表A的元素類型爲整型,要求B、C表利用A表的結點)。

(3)void union(LinkList& La, LinkList& Lb,LinkList& Lc )

{ pa = La->next;//初始化

Lb->next = NULL;

Lc->next = NULL;

While(pa!=NULL

{

If(pa<0)

{Lb->next=pa;

  Lb=Lb->next;

}

Else{

Lc->next=pa;

Lc=Lc->next;

}

 

 

(3) 已知長度爲n的線性表A採用順序存儲結構,請寫一時間複雜度爲O(n)、空間複雜度爲O(1)的算法,該算法刪除線性表中所有值爲item的數據元素。

[題目分析] 在順序存儲的線性表上刪除元素,通常要涉及到一系列元素的移動(刪第i個元素,第i+1至第n個元素要依次前移)。本題要求刪除線性表中所有值爲item的數據元素,並未要求元素間的相對位置不變。因此可以考慮設頭尾兩個指針(i=1,j=n),從兩端向中間移動,凡遇到值item的數據元素時,直接將右端元素左移至值爲item的數據元素位置。

void  Delete(ElemType A[ ]int  n)

∥A是有n個元素的一維數組,本算法刪除A中所有值爲item的元素。

{i=1;j=n;∥設置數組低、高端指針(下標)。

 while(i<j

   {while(i<j && A[i]!=item)i++;         ∥若值不爲item,左移指針。

    if(i<jwhile(i<j && A[j]==item)j--;∥若右端元素值爲item,指針左移

    if(i<j)A[i++]=A[j--];

   }

6.設計判斷兩個二叉樹是否相同的算法。

1. 設計判斷兩個二叉樹是否相同的算法

typedef struct node{datatype data; struct node *lchild,*rchild;} bitree;

int judgebitree(bitree*bt1,bitree *bt2)

{

if (bt1==0 &&bt2==0) return(1);

else if (bt1==0 || bt2==0||bt1->data!=bt2->data) return(0);

elsereturn(judgebitree(bt1->lchild,bt2->lchild)*judgebitree(bt1->rchild,bt2->rchild));

}

 

data 

next

7.已知帶有表頭結點的單鏈表,結點結構爲:

假設該鏈表只給出了頭指針list。在不改變鏈表的前提下,請設計一個儘可能高效的算法,查找鏈表中倒數第k個位置上的結點(k爲正整數)。若查找成功,算法輸出該結點的data值,並返回1;否則,只返回0。要求:  

(1)描述算法的基本設計思想。

(2)根據設計思想,採用C程序設計語言描述算法,關鍵之處請給出簡要註釋。(P377/p73-10)

(1)算法基本思想如下:

從頭到尾遍歷單鏈表,並用指針p指向當前節點的前k個節點。當遍歷到表的最後一個節點時,指針p所指向的節點即爲所查找的節點

(2)詳細設計步驟:

增加兩個指針變量和一個整型變量,從鏈表頭向後遍歷,其中指針p1指向當前遍歷的節點,指針p指向p1所指向節點的前k個節點,如果p1之前沒有k個節點,那麼p指向表頭節點。

用整型變量i表示當前遍歷了多少節點,當i>k時,指針p隨着每次遍歷也向前移動一個節點。當遍歷完成時,p或者指向表頭節點,或者指向鏈表中倒數第k個位置上的節點。

 

(4)  算法描述:

int LocateElemInt(LinkList,int k)

{

       p1=L->next;

       p=L;

       i=1;

       while(p1)

       {

              p1=p1->next;

              i++;

              if(i>k)p=p->next;//如果i>k,p也往後移

       }

       if(p==L)return 0;//鏈表中沒有k個節點

       else

       {

              printf("%d\n",p->data);

              return 1;

       }

}

8.利用二叉樹遞歸遍歷算法,編寫統計二叉樹中葉子結點數目的算法。二叉樹採用二叉鏈表存儲的類型定義如下:

typedef char datatype;

typedef struct Node

      { datatype  data;

        struct Node *lchild,*rchild;

 }BiTree;

int leafTree(BiTree *leaf)

{

If(leaf->data==NULL)

Return 0;

Elseif(leaf->Lchild==NULL||leaf->Lchild==NULL)

Return 1;

Else

Return leafTree(leaf->lchild)+leafTree(leaf->Rchild);

}

/////////////////////////////////////////////////

void CounUntleaf(BiTree *root)

{

         if(root!=NULL)

         {

                   if(root->lchild!=NULL)||(root->rchild!=NULL)

                   {

                            Count++;

                            printf(root->data);

                   }

                   CountUnleaf(root->lchild);

                  CountUnleaf(root->rchild);

         }

}

9.設二叉排序樹按照二叉鏈表存儲,編寫算法InsertBST(BSTree*&bst, KeyType k)在二叉排序樹中插入一個結點。二叉排序樹的鏈式存儲結構的類型定義如下:typedef  int KeyType;

typedef struct Node

        { KeyType  key;

          struct Node*lchild,*rchild;

 }BSTree;

InsertBST(BSTree*bst,KeyType k)

{

Bitree s;

If(*bst==NULL)

{

S=(BSTree*)malloc(sizeof(BSTree));

s->key=key;

s->lchild=NULL;

s->rchild=NULL;

*bst=s;}

Elseif(key<bst->key)

InsertBST(&bst->lchild,key);

Elseif(key>bst->key)

InsertBST(&bst->rchild,key);

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章