久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

數據結構習題(可用)

時間:2019-05-13 22:10:34下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《數據結構習題(可用)》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《數據結構習題(可用)》。

第一篇:數據結構習題(可用)

第 1 章 緒 論

1.填空

⑴()是數據的基本單位,在計算機程序中通常作為一個整體進行考慮和處理。【解答】數據元素

⑵()是數據的最小單位,()是討論數據結構時涉及的最小數據單位。【解答】數據項,數據元素

【分析】數據結構指的是數據元素以及數據元素之間的關系。

⑶ 從邏輯關系上講,數據結構主要分為()、()、()和()。【解答】集合,線性結構,樹結構,圖結構

⑷ 數據的存儲結構主要有()和()兩種基本方法,不論哪種存儲結構,都要存儲兩方面的內容:()和()。

【解答】順序存儲結構,鏈接存儲結構,數據元素,數據元素之間的關系 ⑸ 算法具有五個特性,分別是()、()、()、()、()。【解答】有零個或多個輸入,有一個或多個輸出,有窮性,確定性,可行性

⑹ 算法的描述方法通常有()、()、()和()四種,其中,()被稱為算法語言。【解答】自然語言,程序設計語言,流程圖,偽代碼,偽代碼 ⑺ 在一般情況下,一個算法的時間復雜度是()的函數。【解答】問題規模

⑻ 設待處理問題的規模為n,若一個算法的時間復雜度為一個常數,則表示成數量級的形式為(),若為n*log25n,則表示成數量級的形式為()。【解答】Ο(1),Ο(nlog2n)【分析】用大O記號表示算法的時間復雜度,需要將低次冪去掉,將最高次冪的系數去掉。2.選擇題

⑴ 順序存儲結構中數據元素之間的邏輯關系是由()表示的,鏈接存儲結構中的數據元素之間的邏輯關系是由()表示的。

A 線性結構 B 非線性結構 C 存儲位置 D 指針 【解答】C,D 【分析】順序存儲結構就是用一維數組存儲數據結構中的數據元素,其邏輯關系由存儲位置(即元素在數組中的下標)表示;鏈接存儲結構中一個數據元素對應鏈表中的一個結點,元素之間的邏輯關系由結點中的指針表示。

⑵ 假設有如下遺產繼承規則:丈夫和妻子可以相互繼承遺產;子女可以繼承父親或母親的遺產;子女間不能相互繼承。則表示該遺產繼承關系的最合適的數據結構應該是()。A 樹 B 圖 C 線性表 D 集合 【解答】B 【分析】將丈夫、妻子和子女分別作為數據元素,根據題意畫出邏輯結構圖。

⑶ 算法指的是()。A 對特定問題求解步驟的一種描述,是指令的有限序列。B 計算機程序 C 解決問題的計算方法 D 數據處理 【解答】A 【分析】計算機程序是對算法的具體實現;簡單地說,算法是解決問題的方法;數據處理是通過算法完成的。所以,只有A是算法的準確定義。⑷ 下面()不是算法所必須具備的特性。A 有窮性 B 確切性 C 高效性 D 可行性 【解答】C 【分析】高效性是好算法應具備的特性。

⑸ 算法分析的目的是(),算法分析的兩個主要方面是()。A 找出數據結構的合理性 B 研究算法中輸入和輸出的關系 C 分析算法的效率以求改進 D 分析算法的易讀性和文檔性 E 空間性能和時間性能 F 正確性和簡明性 G 可讀性和文檔性 H 數據復雜性和程序復雜性 【解答】C,E 3.判斷題

⑴ 算法的時間復雜度都要通過算法中的基本語句的執行次數來確定。【解答】錯。時間復雜度要通過算法中基本語句執行次數的數量級來確定。⑵ 每種數據結構都具備三個基本操作:插入、刪除和查找。

【解答】錯。如數組就沒有插入和刪除操作。此題注意是每種數據結構。⑶ 所謂數據的邏輯結構指的是數據之間的邏輯關系。【解答】錯。是數據之間的邏輯關系的整體。⑷ 邏輯結構與數據元素本身的內容和形式無關。【解答】對。因此邏輯結構是數據組織的主要方面。⑸ 基于某種邏輯結構之上的基本操作,其實現是唯一的。

【解答】錯。基本操作的實現是基于某種存儲結構設計的,因而不是唯一的。

4.分析以下各程序段,并用大O記號表示其執行時間。

【解答】⑴ 基本語句是k=k+10*i,共執行了n-2次,所以T(n)=O(n)。⑵ 基本語句是k=k+10*i,共執行了n次,所以T(n)=O(n)。⑶ 分析條件語句,每循環一次,i+j 整體加1,共循環n次,所以T(n)=O(n)。⑷ 設循環體共執行T(n)次,每循環一次,循環變量y加1,最終T(n)=y,即:(T(n)+1)2≤n,所以T(n)=O(n1/2)。

⑸ x++是基本語句,所以

5.設有數據結構(D,R),其中D={1, 2, 3, 4, 5, 6},R={(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)}。試畫出其邏輯結構圖并指出屬于何種結構。【解答】其邏輯結構圖如圖1-3所示,它是一種圖結構。

6.求多項式A(x)的算法可根據下列兩個公式之一來設計: ⑴ A(x)=anxn+an-1xn-1+?+a1x+a0 ⑵ A(x)=(?(anx+an-1)x+?+a1)x)+a0

根據算法的時間復雜度分析比較這兩種算法的優劣。

【解答】第二種算法的時間性能要好些。第一種算法需執行大量的乘法運算,而第二種算法進行了優化,減少了不必要的乘法運算。

學習自測及答案

1.順序存儲結構的特點是(),鏈接存儲結構的特點是()。

【解答】用元素在存儲器中的相對位置來表示數據元素之間的邏輯關系,用指示元素存儲地址的指針表示數據元素之間的邏輯關系。

2.算法在發生非法操作時可以作出處理的特性稱為()。【解答】健壯性

3.常見的算法時間復雜度用大O記號表示為:常數階()、對數階()、線性階()、平方階()和指數階()。【解答】O(1),O(log2n),O(n),O(n),O(2)4.試描述數據結構和抽象數據類型的概念與程序設計語言中數據類型概念的區別。

【解答】數據結構是指相互之間存在一定關系的數據元素的集合。而抽象數據類型是指一個數據結構以及定義在該結構上的一組操作。程序設計語言中的數據類型是一個值的集合和定義在這個值集上一組操作的總稱。抽象數據類型可以看成是對數據類型的一種抽象。

第 2 章 線性表

1.填空

2n⑴ 在順序表中,等概率情況下,插入和刪除一個元素平均需移動()個元素,具體移動元素的個數與()和()有關。

【解答】表長的一半,表長,該元素在表中的位置

⑵ 順序表中第一個元素的存儲地址是100,每個元素的長度為2,則第5個元素的存儲地址是()。【解答】108 【分析】第5個元素的存儲地址=第1個元素的存儲地址+(5-1)×2=108

⑶ 設單鏈表中指針p 指向結點A,若要刪除A的后繼結點(假設A存在后繼結點),則需修改指針的操作為()。

【解答】p->next=p->next->next ⑷ 單鏈表中設置頭結點的作用是()。【解答】為了運算方便

【分析】例如在插入和刪除操作時不必對表頭的情況進行特殊處理。

⑸ 非空的單循環鏈表由頭指針head指示,則其尾結點(由指針p所指)滿足()。【解答】p->next=head 【分析】如圖2-8所示。

⑹ 在由尾指針rear指示的單循環鏈表中,在表尾插入一個結點s的操作序列是();刪除開始結點的操作序列為()。

【解答】s->next =rear->next;rear->next =s;rear =s;q=rear->next->next;rear->next->next=q->next;delete q;【分析】操作示意圖如圖2-9所示:

⑺ 一個具有n個結點的單鏈表,在指針p所指結點后插入一個新結點的時間復雜度為();在給定值為x的結點后插入一個新結點的時間復雜度為()。【解答】Ο(1),Ο(n)【分析】在p所指結點后插入一個新結點只需修改指針,所以時間復雜度為Ο(1);而在給定值為x的結點后插入一個新結點需要先查找值為x的結點,所以時間復雜度為Ο(n)。⑻ 可由一個尾指針唯一確定的鏈表有()、()、()。【解答】循環鏈表,循環雙鏈表,雙鏈表 2.選擇題

⑴ 線性表的順序存儲結構是一種()的存儲結構,線性表的鏈接存儲結構是一種()的存儲結構。A 隨機存取 B 順序存取 C 索引存取 D 散列存取 【解答】A,B ⑵ 線性表采用鏈接存儲時,其地址()。

A 必須是連續的B 部分地址必須是連續的 C 一定是不連續的 D 連續與否均可以 【解答】D 【分析】線性表的鏈接存儲是用一組任意的存儲單元存儲線性表的數據元素,這組存儲單元可以連續,也可以不連續,甚至可以零散分布在內存中任意位置。⑶ 單循環鏈表的主要優點是()。A 不再需要頭指針了

B 從表中任一結點出發都能掃描到整個鏈表;

C 已知某個結點的位置后,能夠容易找到它的直接前趨; D 在進行插入、刪除操作時,能更好地保證鏈表不斷開。【解答】B ⑷ 鏈表不具有的特點是()。

A 可隨機訪問任一元素 B 插入、刪除不需要移動元素 C 不必事先估計存儲空間 D 所需空間與線性表長度成正比 【解答】A ⑸ 若某線性表中最常用的操作是取第i 個元素和找第i個元素的前趨,則采用()存儲方法最節省時間。A 順序表 B 單鏈表 C 雙鏈表 D 單循環鏈表 【解答】A 【分析】線性表中最常用的操作是取第i 個元素,所以,應選擇隨機存取結構即順序表,同時在順序表中查找第i個元素的前趨也很方便。單鏈表和單循環鏈表既不能實現隨機存取,查找第i個元素的前趨也不方便,雙鏈表雖然能快速查找第i個元素的前趨,但不能實現隨機存取。

⑹ 若鏈表中最常用的操作是在最后一個結點之后插入一個結點和刪除第一個結點,則采用()存儲方法最節省時間。

A 單鏈表 B 帶頭指針的單循環鏈表 C 雙鏈表 D 帶尾指針的單循環鏈表 【解答】D 【分析】在鏈表中的最后一個結點之后插入一個結點需要知道終端結點的地址,所以,單鏈表、帶頭指針的單循環鏈表、雙鏈表都不合適,考慮在帶尾指針的單循環鏈表中刪除第一個結點,其時間性能是O(1),所以,答案是D。

⑺ 若鏈表中最常用的操作是在最后一個結點之后插入一個結點和刪除最后一個結點,則采用()存儲方法最節省運算時間。

A 單鏈表 B 循環雙鏈表 C單循環鏈表

D 帶尾指針的單循環鏈表 【解答】B 【分析】在鏈表中的最后一個結點之后插入一個結點需要知道終端結點的地址,所以,單鏈表、單循環鏈表都不合適,刪除最后一個結點需要知道終端結點的前驅結點的地址,所以,帶尾指針的單循環鏈表不合適,而循環雙鏈表滿足條件。

⑻ 在具有n個結點的有序單鏈表中插入一個新結點并仍然有序的時間復雜度是()。A O(1)B O(n)C O(n)D O(nlog2n)【解答】B 【分析】首先應順序查找新結點在單鏈表中的位置。

⑼ 對于n個元素組成的線性表,建立一個有序單鏈表的時間復雜度是()。A O(1)B O(n)C O(n)D O(nlog2n)【解答】C 【分析】該算法需要將n個元素依次插入到有序單鏈表中,而插入每個元素需O(n)。⑽ 使用雙鏈表存儲線性表,其優點是可以()。

A 提高查找速度 B 更方便數據的插入和刪除 C 節約存儲空間 D 很快回收存儲空間 【解答】B

22【分析】在鏈表中一般只能進行順序查找,所以,雙鏈表并不能提高查找速度,因為雙鏈表中有兩個指針域,顯然不能節約存儲空間,對于動態存儲分配,回收存儲空間的速度是一樣的。由于雙鏈表具有對稱性,所以,其插入和刪除操作更加方便。

⑾ 在一個單鏈表中,已知q所指結點是p所指結點的直接前驅,若在q和p之間插入s所指結點,則執行()操作。

A s->next=p->next;p->next=s;B q->next=s;s->next=p;C p->next=s->next;s->next=p;D p->next=s;s->next=q;【解答】B 【分析】注意此題是在q和p之間插入新結點,所以,不用考慮修改指針的順序。⑿ 在循環雙鏈表的p所指結點后插入s所指結點的操作是()。A p->next=s;s->prior=p;p->next->prior=s;s->next=p->next;B p->next=s;p->next->prior=s;s->prior=p;s->next=p->next;C s->prior=p;s->next=p->next;p->next=s;p->next->prior=s;D s->prior=p;s->next=p->next;p->next->prior=s;p->next=s 【解答】D 【分析】在鏈表中,對指針的修改必須保持線性表的邏輯關系,否則,將違背線性表的邏輯特征,圖2-10給出備選答案C和D的圖解。

3.判斷題

⑴ 線性表的邏輯順序和存儲順序總是一致的。

【解答】錯。順序表的邏輯順序和存儲順序一致,鏈表的邏輯順序和存儲順序不一定一致。⑵ 線性表的順序存儲結構優于鏈接存儲結構。【解答】錯。兩種存儲結構各有優缺點。⑶ 設p,q是指針,若p=q,則*p=*q。

【解答】錯。p=q只能表示p和q指向同一起始地址,而所指類型則不一定相同。⑷ 線性結構的基本特征是:每個元素有且僅有一個直接前驅和一個直接后繼。

【解答】錯。每個元素最多只有一個直接前驅和一個直接后繼,第一個元素沒有前驅,最后一個元素沒有后繼。

⑸ 在單鏈表中,要取得某個元素,只要知道該元素所在結點的地址即可,因此單鏈表是隨機存取結構。【解答】錯。要找到該結點的地址,必須從頭指針開始查找,所以單鏈表是順序存取結構。

4.請說明順序表和單鏈表各有何優缺點,并分析下列情況下,采用何種存儲結構更好些。

⑴ 若線性表的總長度基本穩定,且很少進行插入和刪除操作,但要求以最快的速度存取線性表中的元素。⑵ 如果n個線性表同時并存,并且在處理過程中各表的長度會動態發生變化。⑶ 描述一個城市的設計和規劃。

【解答】順序表的優點:① 無需為表示表中元素之間的邏輯關系而增加額外的存儲空間;② 可以快速地存取表中任一位置的元素(即隨機存取)。順序表的缺點:① 插入和刪除操作需移動大量元素;② 表的容量難以確定;③ 造成存儲空間的“碎片”。

單鏈表的優點:① 不必事先知道線性表的長度;② 插入和刪除元素時只需修改指針,不用移動元素。單鏈表的缺點:① 指針的結構性開銷;② 存取表中任意元素不方便,只能進行順序存取。

⑴ 應選用順序存儲結構。因為順序表是隨機存取結構,單鏈表是順序存取結構。本題很少進行插入和刪除操作,所以空間變化不大,且需要快速存取,所以應選用順序存儲結構。

⑵ 應選用鏈接存儲結構。鏈表容易實現表容量的擴充,適合表的長度動態發生變化。

⑶ 應選用鏈接存儲結構。因為一個城市的設計和規劃涉及活動很多,需要經常修改、擴充和刪除各種信息,才能適應不斷發展的需要。而順序表的插入、刪除的效率低,故不合適。5.算法設計

⑴ 設計一個時間復雜度為O(n)的算法,實現將數組A[n]中所有元素循環右移k個位置。【解答】算法思想請參見主教材第一章思想火花。下面給出具體算法。

分析算法,第一次調用Reverse函數的時間復雜度為O(k),第二次調用Reverse函數的時間復雜度為O(n-k),第三次調用Reverse函數的時間復雜度為O(n),所以,總的時間復雜度為O(n)。⑵試分別以順序表和單鏈表作存儲結構,各寫一實現線性表就地逆置的算法。

【解答】順序表的逆置,即是將對稱元素交換,設順序表的長度為length,則將表中第i個元素與第length-i-1個元素相交換。具體算法如下:

單鏈表的逆置請參見2.2.4算法2-4和算法2-6。

⑶ 假設在長度大于1的循環鏈表中,即無頭結點也無頭指針,s為指向鏈表中某個結點的指針,試編寫算法刪除結點s的前趨結點。【解答】利用單循環鏈表的特點,通過指針s可找到其前驅結點r以及r的前驅結點p,然后將結點r刪除,如圖2-11所示,具體算法如下:

⑷ 設單鏈表以非遞減有序排列,設計算法實現在單鏈表中刪去值相同的多余結點。

【解答】從頭到尾掃描單鏈表,若當前結點的元素值與后繼結點的元素值不相等,則指針后移;否則刪除該后繼結點。具體算法如下:

⑸ 判斷帶頭結點的雙循環鏈表是否對稱。

【解答】設工作指針p和q分別指向循環雙鏈表的開始結點和終端結點,若結點p和結點q的數據域相等,則工作指針p后移,工作指針q前移,直到指針p和指針q指向同一結點(循環雙鏈表中結點個數為奇數),或結點q成為結點p的前驅(循環雙鏈表中結點個數為偶數)。如圖2-12所示。

學習自測及答案

1.已知一維數組A采用順序存儲結構,每個元素占用4個存儲單元,第9個元素的地址為144,則第一個元素的地址是()。

A 108 B 180 C 176 D 112 【解答】D 2.在長度為n的線性表中查找值為x的數據元素的時間復雜度為:()。A O(0)B O(1)C O(n)D O(n)【解答】C 3.在一個長度為n的順序表的第i(1≤i≤n+1)個元素之前插入一個元素,需向后移動()個元素,刪除第i(1≤i≤n)個元素時,需向前移動()個元素。【解答】n-i+1,n-i 4.在單鏈表中,除了頭結點以外,任一結點的存儲位置由()指示。【解答】其前趨結點的指針域

5.當線性表采用順序存儲結構時,其主要特點是()。【解答】邏輯結構中相鄰的結點在存儲結構中仍相鄰

6.在雙鏈表中,每個結點設置了兩個指針域,其中一個指向()結點,另一個指向()結點。【解答】前驅,后繼

第 3 章 特殊線性表——棧、隊列和串

1.填空

⑴ 設有一個空棧,棧頂指針為1000H,現有輸入序列為1、2、3、4、5,經過push,push,pop,push,pop,push,push后,輸出序列是(),棧頂指針為()。【解答】23,1003H ⑵ 棧通常采用的兩種存儲結構是();其判定棧空的條件分別是(),判定棧滿的條件分別是()。

2【解答】順序存儲結構和鏈接存儲結構(或順序棧和鏈棧),棧頂指針top=-1和top=NULL,棧頂指針top等于數組的長度和內存無可用空間

⑶()可作為實現遞歸函數調用的一種數據結構。【解答】棧

【分析】遞歸函數的調用和返回正好符合后進先出性。⑷ 表達式a*(b+c)-d的后綴表達式是()。【解答】abc+*d-【分析】將中綴表達式變為后綴表達式有一個技巧:將操作數依次寫下來,再將算符插在它的兩個操作數的后面。

⑸ 棧和隊列是兩種特殊的線性表,棧的操作特性是(),隊列的操作特性是(),棧和隊列的主要區別在于()。

【解答】后進先出,先進先出,對插入和刪除操作限定的位置不同 ⑹ 循環隊列的引入是為了克服()。【解答】假溢出

⑺ 數組Q[n]用來表示一個循環隊列,front為隊頭元素的前一個位置,rear為隊尾元素的位置,計算隊列中元素個數的公式為()。【解答】(rear-front+n)% n 【分析】也可以是(rear-front)% n,但rear-front的結果可能是負整數,而對一個負整數求模,其結果在不同的編譯器環境下可能會有所不同。

⑻ 用循環鏈表表示的隊列長度為n,若只設頭指針,則出隊和入隊的時間復雜度分別是()和()。【解答】O(1),O(n)【分析】在帶頭指針的循環鏈表中,出隊即是刪除開始結點,這只需修改相應指針;入隊即是在終端結點的后面插入一個結點,這需要從頭指針開始查找終端結點的地址。⑼ 串是一種特殊的線性表,其特殊性體現在()。【解答】數據元素的類型是一個字符 ⑽ 兩個串相等的充分必要條件是()。【解答】長度相同且對應位置的字符相等 【分析】例如“abc”≠“abc ”,“abc”≠“bca”。2.選擇題

⑴ 若一個棧的輸入序列是1,2,3,?,n,輸出序列的第一個元素是n,則第i個輸出元素是()。A 不確定 B n-I C n-i-1 D n-i+1 【解答】D 【分析】此時,輸出序列一定是輸入序列的逆序。

⑵ 設棧S和隊列Q的初始狀態為空,元素e1、e2、e3、e4、e5、e6依次通過棧S,一個元素出棧后即進入隊列Q,若6個元素出隊的順序是e2、e4、e3、e6、e5、e1,則棧S的容量至少應該是()。A 6

B 4

C 3

D 2 【解答】C 【分析】由于隊列具有先進先出性,所以,此題中隊列形同虛設,即出棧的順序也是e2、e4、e3、e6、e5、e1。

⑶ 一個棧的入棧序列是1,2,3,4,5,則棧的不可能的輸出序列是()。A 54321 B 45321 C 43512 D 12345 【解答】C 【分析】此題有一個技巧:在輸出序列中任意元素后面不能出現比該元素小并且是升序(指的是元素的序號)的兩個元素。

⑷ 設計一個判別表達式中左右括號是否配對的算法,采用()數據結構最佳 A 順序表 B 棧 C 隊列 D 鏈表 【解答】B 【分析】每個右括號與它前面的最后一個沒有匹配的左括號配對,因此具有后進先出性。

⑸ 在解決計算機主機與打印機之間速度不匹配問題時通常設置一個打印緩沖區,該緩沖區應該是一個()結構。

A 棧 B隊列 C 數組 D線性表 【解答】B 【分析】先進入打印緩沖區的文件先被打印,因此具有先進先出性。⑹ 一個隊列的入隊順序是1,2,3,4,則隊列的輸出順序是()。

A 4321 B 1234 C 1432 D 3241 【解答】B 【分析】隊列的入隊順序和出隊順序總是一致的。⑺ 棧和隊列的主要區別在于()。

A 它們的邏輯結構不一樣 B 它們的存儲結構不一樣 C 所包含的運算不一樣 D 插入、刪除運算的限定不一樣 【解答】D 【分析】棧和隊列的邏輯結構都是線性的,都有順序存儲和鏈接存儲,有可能包含的運算不一樣,但不是主要區別,任何數據結構在針對具體問題時包含的運算都可能不同。

⑻ 設數組S[n]作為兩個棧S1和S2的存儲空間,對任何一個棧只有當S[n]全滿時才不能進行進棧操作。為這兩個棧分配空間的最佳方案是()。A S1的棧底位置為0,S2的棧底位置為n-1 B S1的棧底位置為0,S2的棧底位置為n/2 C S1的棧底位置為0,S2的棧底位置為n D S1的棧底位置為0,S2的棧底位置為1 【解答】A 【分析】兩棧共享空間首先兩個棧是相向增長的,棧底應該分別指向兩個棧中的第一個元素的位置,并注意C++中的數組下標是從0開始的。3.判斷題

⑴ 棧可以作為實現過程調用的一種數據結構。

【解答】對。只要操作滿足后進先出性,都可以采用棧作為輔助數據結構。⑵ 在棧滿的情況下不能做進棧操作,否則將產生“上溢”。【解答】對。

⑶ 在循環隊列中,front指向隊頭元素的前一個位置,rear指向隊尾元素的位置,則隊滿的條件是front=rear。

【解答】錯。這是隊空的判定條件,在循環隊列中要將隊空和隊滿的判定條件區別開。⑷ 空串與空格串是相同的。

【解答】錯。空串的長度為零,而空格串的長度不為0,其長度是串中空格的個數。

4.設有一個棧,元素進棧的次序為A,B,C,D,E,能否得到如下出棧序列,若能,請寫出操作序列,若不能,請說明原因。⑴ C,E,A,B,D ⑵ C,B,A,D,E 【解答】⑴不能,因為在C、E出棧的情況下,A一定在棧中,而且在B的下面,不可能先于B出棧。⑵可以,設I為進棧操作,O為入棧操作,則其操作序列為IIIOOOIOIO。

5.舉例說明順序隊列的“假溢出”現象。

【解答】假設有一個順序隊列,如圖3-6所示,隊尾指針rear=4,隊頭指針front=1,如果再有元素入隊,就會產生“上溢”,此時的“上溢”又稱為“假溢出”,因為隊列并不是真的溢出了,存儲隊列的數組中還有2個存儲單元空閑,其下標分別為0和1。

6.在操作序列push(1)、push(2)、pop、push(5)、push(7)、pop、push(6)之后,棧頂元素和棧底元素分別是什么?(push(k)表示整數k入棧,pop表示棧頂元素出棧。)【解答】棧頂元素為6,棧底元素為1。其執行過程如圖3-7所示。

7. 在操作序列EnQueue(1)、EnQueue(3)、DeQueue、EnQueue(5)、EnQueue(7)、DeQueue、EnQueue(9)之后,隊頭元素和隊尾元素分別是什么?(EnQueue(k)表示整數k入隊,DeQueue表示隊頭元素出隊)。【解答】隊頭元素為5,隊尾元素為9。其執行過程如圖3-8所示。

8.空串和空格串有何區別?串中的空格符有何意義?空串在串處理中有何作用? 【解答】不含任何字符的串稱為空串,其長度為零。僅含空格的串稱為空格串,它的長度為串中空格符的個數。串中的空格符可用來分隔一般的字符,便于人們識別和閱讀,但計算串長時應包括這些空格符。空串在串處理中可作為任意串的子串。9.算法設計

⑴ 假設以不帶頭結點的循環鏈表表示隊列,并且只設一個指針指向隊尾結點,但不設頭指針。試設計相應的入隊和出隊的算法。

【解答】出隊操作是在循環鏈表的頭部進行,相當于刪除開始結點,而入隊操作是在循環鏈表的尾部進行,相當于在終端結點之后插入一個結點。由于循環鏈表不帶頭結點,需要處理空表的特殊情況。入隊算法如下:

出隊算法如下:

⑵ 設順序棧S中有2n個元素,從棧頂到棧底的元素依次為a2n,a2n-1,?,a1,要求通過一個循環隊列重新排列棧中元素,使得從棧頂到棧底的元素依次為a2n,a2n-2,?,a2,a2n-1,a2n-3,?,a1,請設計算法實現該操作,要求空間復雜度和時間復雜度均為O(n)。【解答】操作步驟為: ① ② ③ 將所有元素出棧并入隊;

依次將隊列元素出隊,如果是偶數結點,則再入隊,如果是奇數結點,則入棧; 將奇數結點出棧并入隊; ④ ⑤ ⑥ 將偶數結點出隊并入棧; 將所有元素出棧并入隊; 將所有元素出隊并入棧即為所求。

學習自測及答案

1.在一個具有n個單元的順序棧中,假定以地址低端(即下標為0的單元)作為棧底,以top作為棧頂指針,當出棧時,top的變化為()。

A 不變;B top=0;C top=top-1;D top=top+1;【解答】C 2.一個棧的入棧序列是a, b, c, d, e,則棧的不可能的出棧序列是()。A edcba B cdeba C debca D abcde 【解答】C 3.從棧頂指針為top的鏈棧中刪除一個結點,用x保存被刪除結點的值,則執行()。A x=top;top=top->next;B x=top->data;C top=top->next;x=top->data;D x=top->data;top=top->next;【解答】D 4.設元素1, 2, 3, P, A依次經過一個棧,進棧次序為123PA,在棧的輸出序列中,有哪些序列可作為C程序設計語言的變量名。

【解答】PA321, P3A21, P32A1, P321A, AP321 5.設S=“I_ am_ a_ teacther”,其長度為()。【解答】15 6.對于棧和隊列,無論它們采用順序存儲結構還是鏈接存儲結構,進行插入和刪除操作的時間復雜度都是()。【解答】O(1)7.如果進棧序列為A、B、C、D,則可能的出棧序列是什么?

答:共14種,分別是:ABCD,ABDC,ACBD,ACDB,ADCB,BACD,BADC,BCAD,BCDA,BDCA,CBAD,CBDA,CDBA,DCBA 8.簡述隊列和棧這兩種數據結構的相同點和不同點。

【解答】相同點:它們都是插入和刪除操作的位置受限制的線性表。

不同點:棧是限定僅在表尾進行插入和刪除的線性表,是后進先出的線性表,而隊列是限定在表的一端進行插入,在另一端進行刪除的線性表,是先進先出的線性表。

9.設計算法把一個十進制整數轉換為二至九進制之間的任一進制數輸出。

【解答】算法基于原理:N=(N div d)×d + N mod d(div為整除運算,mod為求余運算)。

10.假設一個算術表達式中可以包含三種括號:圓括號“(”和“)”,方括號“[”和“]”以及花括號“{”和“}”,且這三種括號可按任意的次序嵌套使用。編寫算法判斷給定表達式中所含括號是否配對出現。

【解答】假設表達式已存入字符數組A[n]中,具體算法如下:

第 4 章 廣義線性表——多維數組和廣義表

1.填空

⑴ 數組通常只有兩種運算:()和(),這決定了數組通常采用()結構來實現存儲。【解答】存取,修改,順序存儲

【分析】數組是一個具有固定格式和數量的數據集合,在數組上一般不能做插入、刪除元素的操作。除了初始化和銷毀之外,在數組中通常只有存取和修改兩種操作。

⑵ 二維數組A中行下標從10到20,列下標從5到10,按行優先存儲,每個元素占4個存儲單元,A[10][5]的存儲地址是1000,則元素A[15][10]的存儲地址是()。【解答】1140 【分析】數組A中每行共有6個元素,元素A[15][10]的前面共存儲了(15-10)×6+5個元素,每個元素占4個存儲單元,所以,其存儲地址是1000+140=1140。⑶ 設有一個10階的對稱矩陣A采用壓縮存儲,A[0][0]為第一個元素,其存儲地址為d,每個元素占1個存儲單元,則元素A[8][5]的存儲地址為()。【解答】d+41 【分析】元素A[8][5]的前面共存儲了(1+2+?+8)+5=41個元素。⑷ 稀疏矩陣一般壓縮存儲方法有兩種,分別是()和()。【解答】三元組順序表,十字鏈表

⑸ 廣義表((a),(((b),c)),(d))的長度是(),深度是(),表頭是(),表尾是()。【解答】3,4,(a),((((b),c)),(d))⑹ 已知廣義表LS=(a,(b,c,d),e),用Head和Tail函數取出LS中原子b的運算是()。【解答】Head(Head(Tail(LS)))2.選擇題

⑴ 二維數組A的每個元素是由6個字符組成的串,行下標的范圍從0~8,列下標的范圍是從0~9,則存放A至少需要()個字節,A的第8列和第5行共占()個字節,若A按行優先方式存儲,元素A[8][5]的起始地址與當A按列優先方式存儲時的()元素的起始地址一致。A 90 B 180 C 240 D 540 E 108 F 114 G 54 H A[8][5] I A[3][10] J A[5][8] K A[4][9] 【解答】D,E,K 【分析】數組A為9行10列,共有90個元素,所以,存放A至少需要90×6=540個存儲單元,第8列和第5行共有18個元素(注意行列有一個交叉元素),所以,共占108個字節,元素A[8][5]按行優先存儲的起始地址為d+8×10+5=d+85,設元素A[i][j]按列優先存儲的起始地址與之相同,則d+j×9+i=d+85,解此方程,得i=4,j=9。

⑵ 將數組稱為隨機存取結構是因為()

A 數組元素是隨機的 B 對數組任一元素的存取時間是相等的 C 隨時可以對數組進行訪問 D 數組的存儲結構是不定 【解答】B ⑶ 下面的說法中,不正確的是()

A 數組是一種線性結構 B 數組是一種定長的線性結構 C 除了插入與刪除操作外,數組的基本操作還有存取、修改、檢索和排序等 D 數組的基本操作有存取、修改、檢索和排序等,沒有插入與刪除操 【解答】C 【分析】數組屬于廣義線性表,數組被創建以后,其維數和每維中的元素個數是確定的,所以,數組通常沒有插入和刪除操作。

⑷ 對特殊矩陣采用壓縮存儲的目的主要是為了()

A 表達變得簡單 B 對矩陣元素的存取變得簡單 C 去掉矩陣中的多余元素 D 減少不必要的存儲空間 【解答】D 【分析】在特殊矩陣中,有很多值相同的元素并且他們的分布有規律,沒有必要為值相同的元素重復存儲。⑸ 下面()不屬于特殊矩陣。

A 對角矩陣 B 三角矩陣 C 稀疏矩陣 D 對稱矩陣 【解答】C ⑹ 若廣義表A滿足Head(A)=Tail(A),則A為()

A()B(())C((),())D((),(),())【解答】B ⑺ 下面的說法中,不正確的是()A 廣義表是一種多層次的結構 B 廣義表是一種非線性結構 C 廣義表是一種共享結構 D 廣義表是一種遞歸 【解答】B 【分析】從各層元素各自具有的線性關系講,廣義表屬于線性結構。⑻ 下面的說法中,不正確的是()

A 對稱矩陣只須存放包括主對角線元素在內的下(或上)三角的元素即可。B 對角矩陣只須存放非零元素即可。

C 稀疏矩陣中值為零的元素較多,因此可以采用三元組表方法存儲。

D 稀疏矩陣中大量值為零的元素分布有規律,因此可以采用三元組表方法存儲 【解答】D 【分析】稀疏矩陣中大量值為零的元素分布沒有規律,因此采用三元組表存儲。如果零元素的分布有規律,就沒有必要存儲非零元素的行號和列號,而需要按其壓縮規律找出相應的映象函數。3.判斷題

⑴ 數組是一種復雜的數據結構,數組元素之間的關系既不是線性的,也不是樹形的。【解答】錯。例如二維數組可以看成是數據元素為線性表的線性表。⑵ 使用三元組表存儲稀疏矩陣的元素,有時并不能節省存儲空間。

【解答】對。因為三元組表除了存儲非零元素值外,還需要存儲其行號和列號。⑶ 稀疏矩陣壓縮存儲后,必會失去隨機存取功能。

【解答】對。因為壓縮存儲后,非零元素的存儲位置和行號、列號之間失去了確定的關系。

⑷ 線性表可以看成是廣義表的特例,如果廣義表中的每個元素都是單元素,則廣義表便成為線性表。【解答】對。

⑸ 若一個廣義表的表頭為空表,則此廣義表亦為空表。

【解答】錯。如廣義表L=((),(a,b))的表頭為空表,但L不是空表。4.一個稀疏矩陣如圖4-4所示,寫出對應的三元組順序表和十字鏈表存儲表示。

【解答】對應的三元組順序表如圖4-5所示,十字鏈表如圖4-6所示。

5.設某單位職工工資表ST由“工資”、“扣除”和“實發金額”三項組成,其中工資項包括“基本工資”、“津貼”和“獎金”,扣除項包括“水”、“電”和“煤氣”。

⑴ 請用廣義表形式表示所描述的工資表ST,并用表頭和表尾求表中的“獎金”項; ⑵ 畫出該工資表ST的存儲結構。

【解答】⑴ ST=((基本工資,津貼,獎金),(水,電,煤氣),實發金額)Head(Tail(Tail(Head(ST))))=獎金 ⑵ 工資表ST的頭尾表示法如圖4-7所示。

學習自測及答案 1.二維數組M中每個元素的長度是3個字節,行下標從0到7,列下標從0到9,從首地址d開始存儲。若按行優先方式存儲,元素M[7][5]的起始地址為(),若按列優先方式存儲,元素M[7][5]的起始地址為()。【解答】d+22,d+141 2.一個n×n的對稱矩陣,按行優先或列優先進行壓縮存儲,則其存儲容量為()。【解答】n(n+1)/2 3.設n行n列的下三角矩陣A(行列下標均從1開始)已壓縮到一維數組S[1]~S[n(n+1)/2]中,若按行優先存儲,則A[i][j]在數組S中的存儲位置是()。【解答】i×(i-1)/2+j 4.已知廣義表LS=(a,(b, c),(d, e, a)),運用Head函數和Tail函數取出LS中原子d的運算是()。【解答】Head(Head(Tail(Tail(LS))))5.廣義表(a, b,(c,(d)))的表尾是()。

A(d)B(c,(d))C b,(c,(d))D(b,(c,(d)))【解答】D 6.設有三對角矩陣An×n(行、列下標均從0開始),將其三條對角線上的元素逐行存于數組B[3n-2]中,使得B[k]=aij求:

⑴ 用i, j表示k的下標變換公式; ⑵ 用k表示i, j的下標變換公式。

【解答】⑴ 要求i, j表示k的下標變換公式,就是要求在k之前已經存儲了多少個非零元素,這些非零元素的個數就是k的值。元素aij求所在的行為i,列為j,則在其前面的非零元素的個數是;k=2 + 3(i-1)+(j-i + 1)= 2i+ j。

⑵ 因為k和i, j之間是一一對應的關系,k+1是當前非零元素的個數,整除即為其所在行號,取余表示當前行中第幾個非零元素,加上前面零元素所在列數就是當前列號,即:

第 5 章 樹和二叉樹 課后習題講解

1.填空題

⑴ 樹是n(n≥0)結點的有限集合,在一棵非空樹中,有()個根結點,其余的結點分成m(m>0)個()的集合,每個集合都是根結點的子樹。【解答】有且僅有一個,互不相交

⑵ 樹中某結點的子樹的個數稱為該結點的(),子樹的根結點稱為該結點的(),該結點稱為其子樹根結點的()。

【解答】度,孩子,雙親

⑶ 一棵二叉樹的第i(i≥1)層最多有()個結點;一棵有n(n>0)個結點的滿二叉樹共有()個葉子結點和()個非終端結點。【解答】2i-1,(n+1)/2,(n-1)/2 【分析】設滿二叉樹中葉子結點的個數為n0,度為2的結點個數為n2,由于滿二叉樹中不存在度為1的結點,所以n=n0+n2;由二叉樹的性質n0=n2+1,得n0=(n+1)/2,n2=(n-1)/2。⑷ 設高度為h的二叉樹上只有度為0和度為2的結點,該二叉樹的結點數可能達到的最大值是(),最小值是()。【解答】2h-1,2h-1 【分析】最小結點個數的情況是第1層有1個結點,其他層上都只有2個結點。⑸ 深度為k的二叉樹中,所含葉子的個數最多為()。【解答】2k-1 【分析】在滿二叉樹中葉子結點的個數達到最多。⑹ 具有100個結點的完全二叉樹的葉子結點數為()。【解答】50 【分析】100個結點的完全二叉樹中最后一個結點的編號為100,其雙親即最后一個分支結點的編號為50,也就是說,從編號51開始均為葉子。

⑺ 已知一棵度為3的樹有2個度為1的結點,3個度為2的結點,4個度為3的結點。則該樹中有()個葉子結點。【解答】12 【分析】根據二叉樹性質3的證明過程,有n0=n2+2n3+1(n0、n2、n3分別為葉子結點、度為2的結點和度為3的結點的個數)。

⑻ 某二叉樹的前序遍歷序列是ABCDEFG,中序遍歷序列是CBDAFGE,則其后序遍歷序列是()。【解答】CDBGFEA 【分析】根據前序遍歷序列和后序遍歷序列將該二叉樹構造出來。

⑼ 在具有n個結點的二叉鏈表中,共有()個指針域,其中()個指針域用于指向其左右孩子,剩下的()個指針域則是空的。【解答】2n,n-1,n+1 ⑽ 在有n個葉子的哈夫曼樹中,葉子結點總數為(),分支結點總數為()。【解答】n,n-1 【分析】n-1個分支結點是經過n-1次合并后得到的。2.選擇題

⑴ 如果結點A有3個兄弟,B是A的雙親,則結點B的度是()。A 1 B 2 C 3 D 4 【解答】D ⑵ 設二叉樹有n個結點,則其深度為()。A n-1 B n C 【解答】D 【分析】此題并沒有指明是完全二叉樹,則其深度最多是n,最少是

+1。

+1 D 不能確定

⑶ 二叉樹的前序序列和后序序列正好相反,則該二叉樹一定是()的二叉樹。

A 空或只有一個結點 B 高度等于其結點數 C 任一結點無左孩子 D 任一結點無右孩子 【解答】B 【分析】此題注意是序列正好相反,則左斜樹和右斜樹均滿足條件。⑷ 線索二叉樹中某結點R沒有左孩子的充要條件是()。

A R.lchild=NULL B R.ltag=0 C R.ltag=1 D R.rchild=NULL 【解答】C 【分析】線索二叉樹中某結點是否有左孩子,不能通過左指針域是否為空來判斷,而要判斷左標志是否為1。

⑸一個高度為h的滿二叉樹共有n個結點,其中有m個葉子結點,則有()成立。A n=h+m B h+m=2n C m=h-1 D n=2m-1 【解答】D 【分析】滿二叉樹中沒有度為1的結點,所以有m個葉子結點,則度為2的結點個數為m-1。⑹任何一棵二叉樹的葉子結點在前序、中序、后序遍歷序列中的相對次序()。A 肯定不發生改變 B 肯定發生改變 C 不能確定 D 有時發生變化 【解答】A 【分析】三種遍歷次序均是先左子樹后右子樹。

⑺如果T' 是由有序樹T轉換而來的二叉樹,那么T中結點的前序序列就是T' 中結點的()序列,T中結點的后序序列就是 T' 中結點的()序列。

A 前序 B 中序 C 后序 D 層序 【解答】A,B ⑻設森林中有4棵樹,樹中結點的個數依次為n1、n2、n3、n4,則把森林轉換成二叉樹后,其根結點的右子樹上有()個結點,根結點的左子樹上有()個結點。A n1-1 B n1 C n1+n2+n3 D n2+n3+n4 【解答】D,A 【分析】由森林轉換的二叉樹中,根結點即為第一棵樹的根結點,根結點的左子樹是由第一棵樹中除了根結點以外其余結點組成的,根結點的右子樹是由森林中除第一棵樹外其他樹轉換來的。⑼ 討論樹、森林和二叉樹的關系,目的是為了()。A 借助二叉樹上的運算方法去實現對樹的一些運算

B 將樹、森林按二叉樹的存儲方式進行存儲并利用二叉樹的算法解決樹的有關問題 C 將樹、森林轉換成二叉樹 D 體現一種技巧,沒有什么實際意義 【解答】B 3.判斷題

⑴ 在線索二叉樹中,任一結點均有指向其前趨和后繼的線索。

【解答】錯。某結點是否有前驅或后繼的線索,取決于該結點的標志域是否為1。⑵ 在二叉樹的前序遍歷序列中,任意一個結點均處在其子女的前面。【解答】對。由前序遍歷的操作定義可知。⑶ 二叉樹是度為2的樹。

【解答】錯。二叉樹和樹是兩種不同的樹結構,例如,左斜樹是一棵二叉樹,但它的度為1。⑷ 由樹轉換成二叉樹,其根結點的右子樹總是空的。【解答】對。因為根結點無兄弟結點。⑸ 用一維數組存儲二叉樹時,總是以前序遍歷存儲結點。

【解答】錯。二叉樹的順序存儲結構是按層序存儲的,一般適合存儲完全二叉樹。4.證明:對任一滿二叉樹,其分枝數B=2(n0-1)。(其中,n0為終端結點數)【解答】因為在滿二叉樹中沒有度為1的結點,所以有:n=n0+n2 設B為樹中分枝數,則n=B+1;所以B=n0 +n2-1 再由二叉樹性質:n0=n2+1,代入上式有:B=n0+n0-1-1=2(n0-1)

5.已知一棵度為m的樹中有:n1個度為1的結點,n2個度為2的結點,??,nm個度為m的結點,問該樹中共有多少個葉子結點?

【解答】設該樹的總結點數為n,則n=n0+n1+n2+??+nm

又:n=分枝數+1=0×n0+1×n1+2×n2+??+m×nm+1,由上述兩式可得: n0= n2+2n3+??+(m-1)nm+1

6.已知二叉樹的中序和后序序列分別為CBEDAFIGH和CEDBIFHGA,試構造該二叉樹。【解答】二叉樹的構造過程如圖5-12 所示。

7.對給定的一組權值W=(5,2,9,11,8,3,7),試構造相應的哈夫曼樹,并計算它的帶權路徑長度。【解答】構造的哈夫曼樹如圖5-13所示。

樹的帶權路徑長度為: WPL=2×4+3×4+5×3+7×3+8×3+9×2+11×2=120

8.已知某字符串S中共有8種字符,各種字符分別出現2次、1次、4次、5次、7次、3次、4次和9次,對該字符串用[0,1]進行前綴編碼,問該字符串的編碼至少有多少位。【解答】以各字符出現的次數作為葉子結點的權值構造的哈夫曼編碼樹如圖5-14所示。其帶權路徑長度=2×5+1×5+3×4+5×3+9×2+4×3+4×3+7×2=98,所以,該字符串的編碼長度至少為98位。

9.算法設計

⑴ 設計算法按前序次序打印二叉樹中的葉子結點。

【解答】本算法的要求與前序遍歷算法既有相同之處,又有不同之處。相同之處是打印次序均為前序,不同之處是此處不是打印每個結點的值,而是打印出其中的葉子結點,即為有條件打印。為此,將前序遍歷算法中的訪問操作改為條件打印即可。算法如下:

⑵ 設計算法求二叉樹的深度。

【解答】當二叉樹為空時,深度為0;若二叉樹不為空,深度應是其左右子樹深度的最大值加1,而其左右子樹深度的求解又可通過遞歸調用本算法來完成。具體算法如下:

⑶ 編寫算法,要求輸出二叉樹后序遍歷序列的逆序。

【解答】要想得到后序的逆序,只要按照后序遍歷相反的順序即可,即先訪問根結點,再遍歷根結點的右子樹,最后遍歷根結點的左子樹。注意和前序遍歷的區別,具體算法如下:

⑷ 以孩子兄弟表示法做存儲結構,求樹中結點x的第i個孩子。

【解答】先在鏈表中進行遍歷,在遍歷過程中查找值等于x的結點,然后由此結點的最左孩子域firstchild找到值為x結點的第一個孩子,再沿右兄弟域rightsib找到值為x結點的第i個孩子并返回指向這個孩子的指針。

樹的孩子兄弟表示法中的結點結構定義如下: template struct Tnode { T data;TNode *firstchild, *rightsib;};具體算法如下:

學習自測及答案

0.前序遍歷和中序遍歷結果相同的二叉樹是()。A 根結點無左孩子的二叉樹 B 根結點無右孩子的二叉樹 C 所有結點只有左子樹的二叉樹 D 所有結點只有右子樹的二叉樹 【解答】D 1.前序遍歷和中序遍歷結果相同的二叉樹是()。A 根結點無左孩子的二叉樹 B 根結點無右孩子的二叉樹 C 所有結點只有左子樹的二叉樹 D 所有結點只有右子樹的二叉樹【解答】D 2.由權值為{3, 8, 6, 2, 5}的葉子結點生成一棵哈夫曼樹,其帶權路徑長度為()。A 24 B 48 C 53 D 72 【解答】C 3.用順序存儲的方法將完全二叉樹中的所有結點逐層存放在數組A[1] ~ A[n]中,結點A[i]若有左子樹,則左子樹的根結點是()。

A A[2i-1] B A[2i+1] C A[i/2] D A[2i] 【解答】D 4.對任何一棵二叉樹T,如果其終端結點的個數為n0,度為2的結點個數為n2,則()。A n0=n2-1 B n0=n2 C n0=n2+1 D 沒有規律 【解答】C 5.一棵滿二叉樹中共有n個結點,其中有m個葉子結點,深度為h,則()。A n=h+m B h+m=2n C m=h-1 D n=2h-1 【解答】D 6.對于完全二叉樹中的任一結點,若其右分支下的子孫的最大層次為h,則其左分支下的子孫的最大層次為()。

A h B h+1 C h或h+1 D 任意 【解答】C 7.假定一棵度為3的樹中結點數為50,則其最小高度應為。A 3 B 4 C 5 D 6 【解答】C 8.在線索二叉樹中,一個結點是葉子結點的充要條件為()。

A 左線索標志為0,右線索標志為1 B 左線索標志為1,右線索標志為0 C 左、右線索標志均為0 D 左、右線索標志均為1 【解答】C 9.對于一棵具有n個結點的樹,其所有結點的度之和為()。【解答】n-1 10.在順序存儲的二叉樹中,編號為i和j的兩個結點處在同一層的條件是()。【解答】

11.現有按前序遍歷二叉樹的結果ABC,問有哪幾種不同的二叉樹可以得到這一結果? 【解答】共有5種二叉樹可以得到這一結果,如圖5-15所示。

12.試找出分別滿足下列條件的所有二叉樹: ⑴ 前序序列和中序序列相同。⑵ 中序序列和后序序列相同。⑶ 前序序列和后序序列相同。

【解答】 ⑴ 空二叉樹、只有一個根結點的二叉樹和右斜樹。⑵ 空二叉樹、只有一個根結點的二叉樹和左斜樹。⑶ 空二叉樹、只有一個根結點的二叉樹

13.將下面圖5-16所示的樹轉換為二叉樹,圖5-17所示的二叉樹轉換為樹或森林。

【解答】圖5-16所示樹轉換的二叉樹如圖5-18所示,圖5-17所示二叉樹轉換的森林如圖5-19所示。

14.以孩子兄弟表示法作為存儲結構,編寫算法求樹的深度。

【解答】采用遞歸算法實現。若樹為空樹,則其深度為0,否則其深度等于第一棵子樹的深度+1和兄弟子樹的深度中的較大者。具體算法如下:

第7章 圖 選擇題 1.對于一個具有n個頂點和e條邊的有向圖,在用鄰接表表示圖時,拓撲排序算法時間復雜度為()A)O(n)B)O(n+e)C)O(n*n)D)O(n*n*n)【答案】B 2.設無向圖的頂點個數為n,則該圖最多有()條邊。A)n-1 B)n(n-1)/2 C)n(n+1)/2 D)n

2【答案】B 3.連通分量指的是()

A)無向圖中的極小連通子圖 B)無向圖中的極大連通子圖 C)有向圖中的極小連通子圖 D)有向圖中的極大連通子圖 【答案】B 4.n個結點的完全有向圖含有邊的數目()A)n*n B)n(n+1)C)n/2

D)n*(n-1)

【答案】D 5.關鍵路徑是()

A)AOE網中從源點到匯點的最長路徑 【答案】A 6.有向圖中一個頂點的度是該頂點的()

A)入度 B)出度 C)入度與出度之和 D)(入度+出度)/2 【答案】C 7.有e條邊的無向圖,若用鄰接表存儲,表中有()邊結點。A)e B)2e C)e-1 D)2(e-1)【答案】B 8.實現圖的廣度優先搜索算法需使用的輔助數據結構為()A)棧 B)隊列 C)二叉樹 D)樹 【答案】B 9.實現圖的非遞歸深度優先搜索算法需使用的輔助數據結構為()A)棧 B)隊列 C)二叉樹 D)樹 【答案】A 10.存儲無向圖的鄰接矩陣一定是一個()

A)上三角矩陣 B)稀疏矩陣 C)對稱矩陣 D)對角矩陣 【答案】C 11.在一個有向圖中所有頂點的入度之和等于出度之和的()倍 A)1/2 【答案】B 12.在圖采用鄰接表存儲時,求最小生成樹的 Prim 算法的時間復雜度為()A)O(n)B)O(n+e)C)O(n)D)O(n)【答案】B 13.下列關于AOE網的敘述中,不正確的是()A)關鍵活動不按期完成就會影響整個工程的完成時間 B)任何一個關鍵活動提前完成,那么整個工程將會提前完成 C)所有的關鍵活動提前完成,那么整個工程將會提前完成 D)某些關鍵活動提前完成,那么整個工程將會提前完成 【答案】B

2B)AOE網中從源點到匯點的最短路徑

C)AOV網中從源點到匯點的最長路徑 D)AOV網中從源點到匯點的最短路徑

B)1 C)2 D)4 14.具有10個頂點的無向圖至少有多少條邊才能保證連通()A)9 【答案】A 15.在含n個頂點和e條邊的無向圖的鄰接矩陣中,零元素的個數為()A)e B)2e C)n-e D)n-2e 【答案】D 2 填空題

1.無向圖中所有頂點的度數之和等于所有邊數的_____________倍。【答案】2 2.具有n個頂點的無向完全圖中包含有_____________條邊,具有n個頂點的有向完全圖中包含有_____________條邊。

【答案】(1)n(n-1)/2(2)n(n-1)3.一個具有n個頂點的無向圖中,要連通所有頂點則至少需要_____________條邊。【答案】n-1 4.假定一個圖具有n個頂點和e條邊,則采用鄰接矩陣、鄰接表表示時,其相應的空間復雜度分別為_____________和_____________。【答案】(1)O(n)(2)O(n+e)5.對用鄰接矩陣表示的圖進行任一種遍歷時,其時間復雜度為_____________,對用鄰接表表示的圖進行任一種遍歷時,其時間復雜度為_____________。【答案】(1)O(n)(2)O(e)6.對于一個具有n個頂點和e條邊的有向圖和無向圖,在其對應的鄰接表中,所含邊結點分別為_____________和_____________條。【答案】(1)e(2)2e 7. 在有向圖的鄰接表和逆鄰接表表示中,每個頂點的邊鏈表中分別鏈接著該頂點的所有_____________和_____________結點。【答案】(1)出邊(2)入邊

8. 對于一個具有n個頂點和e條邊的無向圖,當分別采用鄰接矩陣、鄰接表表示時,求任一頂點度數的時間復雜度依次為_____________和_____________。【答案】(1)O(n)(2)O(e+n)9.對于一個具有n個頂點和e條邊的連通圖,其生成樹中的頂點數和邊數分別為_____________和_____________。

【答案】(1)n(2)n-1 10.Prim算法和Kruscal算法的時間復雜度分別為_____________和_____________。【答案】(1)O(n)(2)O(eloge)11.針對下圖所示的連通網絡,試按如下格式給出在Kruscal算法構造最小生成樹過程中順序選出的各條22

222B)10 C)11 D)12 邊。

【答案】設邊的信息表示為(始點,終點,權值),則在Kruscal算法構造最小生成樹過程中順序選出的各條邊為:(3,5,1),(2,4,2),(1,5,3),(1,2,3)。3 判斷題

1.圖是一種非線性結構,所以只能用鏈式存儲。()【答案】× 2.圖的最小生成樹是唯一的。()【答案】×

3.如果一個圖有n個頂點和小于n-1 條邊,則一定是非連通圖。()【答案】√ 4.有n-1 條邊的圖一定是生成樹。()【答案】×

5.用鄰接矩陣表示圖時,矩陣元素的個數與頂點個數相關,與邊數無關。()【答案】√

6.用鄰接表表示圖時,頂點個數設為n,邊的條數設為e,在鄰接表上執行有關圖的遍歷操作時,時間代價為O(n+e)。()【答案】√

7.逆鄰接表只能用于有向圖,鄰接表對于有向圖和無向圖的存儲都適用。()【答案】√ 8.任何一個關鍵活動提前完成, 那么整個工程將會提前完成。()【答案】× 9.在AOE網絡中關鍵路徑只有一條。()【答案】×

10.在AOV網絡中如果存在環,則拓撲排序不能完成。()【答案】√ 11.圖的鄰接矩陣存儲是唯一的,鄰接表存儲也是唯一的。()【答案】×

12.假設一個有n個頂點和e條弧的有向圖用鄰接表表示,則刪除與某個頂點vi相關的所有弧的時間復雜度是O(n*e)。()【答案】×

13.任意一個圖都是其自身的子圖。()【答案】√

14.一個無向連通圖的生成樹是含有該連通圖的全部頂點的極大連通子圖。()【答案】× 4 應用題

1.設有一有向圖為G=(V,E)。其中,V={ v1, v2, v3, v4, v5},E={, , , , , , },請畫出該有向圖并判斷是否是強連通圖。分析:作該題的關鍵是弄清楚以下兩點

(1)邊集E中表示一條以vi為弧尾,vj為弧頭的有向弧。(2)強連通圖是任意兩頂點間都存在路徑的有向圖。【答案】該有向圖是強連通圖,表示如下:

2.畫出1個頂點、2個頂點、3個頂點、4個頂點和5個頂點的無向完全圖。并說明在n個頂點的無向完全圖中,邊的條數為n(n-1)/2。【答案】

【解析】因為在有n個頂點的無向完全圖中,每一個頂點與其它任一頂點都有一條邊相連,所以每一個頂點有n-1條邊與其他頂點相連,則 n個頂點有n(n-1)條邊。但在無向圖中,頂點i到頂點j與頂點j到頂點i是同一條邊,所以總共有n(n-1)/2條邊。

3.對n個頂點的無向圖G,采用鄰接矩陣表示,如何判別下列有關問題:(1)圖中有多少條邊?(2)任意兩個頂點i和j是否有邊相連?(3)任意一個頂點的度是多少? 【答案】

(1)無向圖的鄰接矩陣是對稱的,故它的邊數應是上三角或下三角的非0元個數。(2)鄰接矩陣中如果第i行第j列的元素非0則表示頂點i與頂點j相連。(3)任意一個頂點vi的度是第i行或第i列上非0元的個數。

4.熟悉圖的存儲結構,畫出下面有向圖的鄰接矩陣、鄰接表、逆鄰接表、十字鏈表。寫出鄰接表表示的圖從頂點A出發的深度優先遍歷序列和廣度優先遍歷序列。

【答案】

鄰接矩陣如下: 鄰接表如下:

逆鄰接表如下:

十字鏈表如下:

深度優先遍歷序列為ABCFED,廣度優先遍歷序列為ABDCEF 5.已知下面是某無向圖的鄰接表,畫出該無向圖,并分別給出從A出發的深度優先搜索生成樹和廣度優先搜索生成樹。

【解析】作該題的關鍵是弄清楚鄰接表的概念,理解深度優先搜索和廣度優先搜索的全過程以及二者的區別。

【答案】該無向圖如下所示:

深度優先搜索生成樹為: 廣度優先搜索生成樹為:

6.請分別用Prim算法和Kruskal算法構造以下網絡的最小生成樹,并求出該樹的代價。

【解析】Prim算法的操作步驟:首先從一個只有一個頂點的集合開始,通過加入與其中頂點相關聯的最小代價的邊來擴充頂點集,直到所有頂點都在一個集合中。【答案】

【解析】Kruscal算法的操作步驟: 首先將n個頂點看成n個互不連通的分量,從邊集中找最小代價的邊,如果落在不同連通分量上,則將其加入最小生成樹,直到所有頂點都在同一連通分量上。【答案】

7. 寫出求以下AOE網的關鍵路徑的過程。要求:給出每一個事件和每一個活動的最早開始時間和最晚開始時間。

【解析】求關鍵路徑首先求關鍵活動,關鍵活動ai的求解過程如下(1)求事件的最早發生時間ve(j), 最晚發生時間vl(j);(2)最早發生時間從ve(0)開始按拓撲排序向前遞推到ve(6), 最晚發生時間從vl(6)按逆拓撲排序向后遞推到 vl(0);(3)計算e(i),l(i):設ai由弧表示,持續時間記為dut,則有下式成立 e(i)=ve(j)l(i)=vl(k)-dut()(4)找出e(i)-l(i)=0的活動既是關鍵活動。【答案】

關鍵路徑為:a0->a4->a6->a9 8. 拓撲排序的結果不是唯一的,試寫出下圖任意2個不同的拓撲序列。

【解析】解題關鍵是弄清拓撲排序的步驟(1)在AOV網中,選一個沒有前驅的結點且輸出;(2)刪除該頂點和以它為尾的弧;(3)重復上述步驟直至全部頂點均輸出或不再有無前驅的頂點。【答案】(1)0132465(2)0123465 9.給定帶權有向圖G和源點v1,利用迪杰斯特拉(Dijkstra)算法求從v1到其余各頂點的最短路徑。

【解析】求解該題的關鍵是掌握迪杰斯特拉(Dijkstra)算法的設計原理----從一個頂點v到另一頂點vk的最短路徑或者是(v,vk)或者是(v,vj,vk),它的長度或者是從v到vk弧上的權值,或者是D[j]與vj到vk弧上的權值之和,其中D[j]是已經找到的從v到vj的最短路徑。【答案】S是已找到最短路徑的終點的集合。

10.利用Floyd算法求下圖中各對頂點之間的路徑。

【解析】Floyd算法是依次添加頂點來修改相應路徑,也就是說,若(vi,...,vk)和(vk,...,vj)分別是從vi到vk和從vk到vj的中間頂點的序號不大于k-1的最短路徑,則將(vi,...vk,...,vj)和已經得到的從vi到vj且中間頂點序號不大于k-1的最短路徑相比較,其長度較短者便是從vi到vj的中間頂點的序號不大于k的最短路徑。經過n次比較后必求得vi到vj的最短路徑,依次,可求得各對頂點間的最短路徑。

求解的關鍵是求解如下的一個n階方陣序列: D(-1),D,D,...,D,D[i][j]=G.arcs[i][j](k-1)(0)(1)(k)(n-1)其中 D(-1)(k)D=Min{D【答案】 [i][j],D(k-1)[i][k]+D

(k-1)

[k][j]} 0≤k≤n-1

每對頂點之間的最短路徑及長度總結如下: 頂點A到頂點C最短路徑為:A->C,長度為:1 頂點A到頂點B最短路徑為:A->C->B,長度為:4 頂點C到頂點A最短路徑為:C->B->A,長度為:12 頂點C到頂點B最短路徑為:C->B,長度為:3 頂點B到頂點A最短路徑為:B->A,長度為:9 頂點B到頂點C最短路徑為:B->A->C,長度為:10

第8章 查找 選擇題

1.順序查找法適合于存儲結構為()的線性表。

A)散列存儲 B)順序存儲或鏈接存儲 C)壓縮存儲 D)索引存儲 【答案】B 2.下面哪些操作不屬于靜態查找表()A)查詢某個特定元素是否在表中 C)插入一個數據元素

B)檢索某個特定元素的屬性 D)建立一個查找表 【答案】C 3.下面描述不正確的是()

A)順序查找對表中元素存放位置無任何要求,當n較大時,效率低。B)靜態查找表中關鍵字有序時,可用二分查找。C)分塊查找也是一種靜態查找表。

D)經常進行插入和刪除操作時可以采用二分查找。【答案】D 4.散列查找時,解決沖突的方法有()A)除留余數法 【答案】D 5.若表中的記錄順序存放在一個一維數組中,在等概率情況下順序查找的平均查找長度為()A)O(1)

【答案】C 6.對長度為4的順序表進行查找,若第一個元素的概率為1/8,第二個元素的概率為1/4,第三個元素的概率為3/8,第四個元素的概率為1/4,則查找任一個元素的平均查找長度為()A)11/8 B)7/4 【答案】C 【解析】對順序表查找,ASL=,代入題目得: ASL=4*(1/8)+3*(1/4)+2*(3/8)+1*(1/4)=9/4 7.靜態查找表與動態查找表二者的根本差別在于()

A)它們的邏輯結構不一樣 B)施加在其上的操作不同 C)所包含的數據元素的類型不一樣 D)存儲實現不一樣 【答案】B 8.若查找表中的記錄按關鍵字的大小順序存放在一個一維數組中,在等概率情況下二分法查找的平均檢索長度是()A)O(n)【答案】B 9.對有14個數據元素的有序表R[14](假設下標從1開始)進行二分查找,搜索到R[4]的關鍵碼等于給定值,此時元素比較順序依次為()。

A)R[1],R[2],R[3],R[4] B)R[1],R[13],R[2],R[3] C)R[7],R[3],R[5],R[4] D)R[7],R[4],R[2],R[3] 【答案】C 10.設有一個長度為100的已排好序的表,用二分查找進行查找,若查找不成功,至少比較()次。A)9 B)8

C)7

D)6 【答案】B 【解析】二分查找不成功時和給定值進行比較的關鍵字個數最多不超過二叉判定樹的深度。100個元素查找表的判定樹深為8(64<100<128)。

11.請指出在順序表{2,5,7,10,14,15,18,23,35,41,52}中,用二分法查找關鍵碼12需做()次關鍵碼比較。A)2 B)3 C)4

D)5 【答案】C 12.從具有 n 個結點的二叉排序樹中查找一個元素時,在最壞情況下的時間復雜度為()。A)O(n)B)O(1)C)O(log 2 n)D)O(n)【答案】C

2B)數字分析法 C)直接定址法 D)鏈地址法

B)O(log2n)C)O(n)D)O(n)C)9/4 D)11/4 B)O(log2n)C)O(nlog2n)D)O((log2n))

213.分塊查找時確定塊的查找可以用順序查找,也可以用(),而在塊中只能是()A)靜態查找,順序查找

C)二分查找,二分查找

【答案】B 14.采用分塊查找時,若線性表中共有625個元素,查找每個元素的概率相同,假設采用順序查找來確定結點所在的塊時,每塊應分()個結點最佳。A)10 B)25

C)6 D)625 【答案】B 15.采用分塊查找法(塊長為s,以二分查找確定塊)查找長度為n的線性表時,每個元素的平均查找長度為()

A)s+n B)log2n+s/2 C)log2(n/s+1)+s/2 D)(n+s)/2 【答案】C 16.對一棵二叉排序樹根結點而言,左子樹中所有結點與右子樹中所有結點的關鍵字大小關系是()A)小于

【答案】A 17.若二叉排序樹中關鍵字互不相同,則下面命題中不正確的是()A)最小元和最大元一定是葉子 B)最大元必無右孩子 C)最小元必無左孩子 【答案】A 18.設二叉排序樹中關鍵字由1至1000的整數構成,現要查找關鍵字為363的結點,下述關鍵字序列()不可能是在二叉排序樹上查找到的序列? A)2,252,401,398,330, 344,397,363 B)924, 220, 911, 244, 898, 258, 362, 363 C)2, 399, 387, 219, 266, 382, 381, 278, 363 D)925, 202, 911, 240, 912, 245, 363 【答案】D 19.在初始為空的散列表中依次插入關鍵字序列(MON,TUE,WED,THU,FRI,SAT,SUN),散列函數為H(k)=i MOD 7,其中,i為關鍵字k的第一個字母在英文字母表中的序號,地址值域為 [0:6],采用線性再散列法處理沖突。插入后的散列表應該如()所示。

A)0 1 2 3 4 5 6 THU TUE WED FRI SUN SAT MON B)0 1 2 3 4 5 6 TUE THU WED FRI SUN SAT MON C)0 1 2 3 4 5 6 TUE THU WED FRI SAT SUN MON D)0 1 2 3 4 5 6 TUE THU WED SUN SAT FRI MON 【答案】B 20.若根據查找表建立長度為 m 的散列表,采用線性探測法處理沖突,假定對一個元素第一次計算的散列地址為 d,則下一次的散列地址為()。

A)d B)(d+1)%m C)(d+1)/m D)d+1 【答案】B 21.若根據查找表建立長度為 m 的散列表,采用二次探測法處理沖突,假定對一個元素第一次計算的散列地址為 d,則第四次計算的散列地址為()。

D)新結點總是作為葉結點插入二叉排序樹 B)大于

C)等于

D)不小于

B)二分查找,順序查找 D)散列查找,順序查找 A)(d+1)%m B)(d-1)%m C)(d+4)%m D)(d-4)%m 【答案】D 22.下面有關散列查找的說法中正確的是()A)直接定址法所得地址集合和關鍵字集合的大小不一定相同。

B)除留余數法構造的哈希函數H(key)=key MOD p,其中P必須選擇素數。C)構造哈希函數時不需要考慮記錄的查找頻率。

D)數字分析法適用于對哈希表中出現的關鍵字事先知道的情況。【答案】D 23.下面有關散列沖突解決的說法中不正確的是()

A)處理沖突即當某關鍵字得到的哈希地址已經存在時,為其尋找另一個空地址。B)使用鏈地址法在鏈表中插入元素的位置隨意,即可以是表頭表尾,也可以在中間。C)二次探測能夠保證只要哈希表未填滿,總能找到一個不沖突的地址。D)線性探測能夠保證只要哈希表未填滿,總能找到一個不沖突的地址。【答案】C 24.設哈希表長m=14,哈希函數H(key)=key%11。表中已有4個結點:addr(15)=4,addr(38)=5,addr(61)=6,addr(84)=7其余地址為空,如用二次探測處理沖突,關鍵字為49的結點的地址是()A)8 B)3 C)5

D)9 【答案】D 2 填空題

1.在散列函數H(key)=key%p中,p應取_____________。【答案】素數

2.采用分塊查找法(塊長為s,以順序查找確定塊)查找長度為n的線性表時的平均查找長度為_____________。【答案】(n/s+1)/2+1 3.己知一個有序表為(12,18,20,25,29,32,40,62,83,90,95,98),當二分查找值為29和90的元素時,分別需要_____________次和_____________次比較才能查找成功;若采用順序查找時,分別需要_____________次和_____________次比較才能查找成功。【答案】(1)4(2)4(3)5(4)10 4.從一棵二叉排序樹中查找一個元素時,若元素的值等于根結點的值,則表明 _____________,若元素的值小于根結點的值,則繼續向 _____________查找,若元素的值大于根結點的值,則繼續向 _____________ 查找。【答案】(1)查找成功

(2)左子樹

(3)右子樹 5.二分查找的存儲結構僅限于 _____________,且是_____________。【答案】(1)順序存儲結構(2)有序

6.假設在有序線性表A[1..20]上進行二分查找,則比較一次查找成功的結點數為 _____________個,比較二次查找成功的結點數為_____________,比較三次查找成功的結點數為_____________,比較四次查找成功的結點數為_____________,比較五次查找成功的結點數為_____________,平均查找長度為_____________。

【答案】(1)1(2)2(3)4(4)8(5)5(6)3.7 7.在對有20個元素的遞增有序表作二分查找時,查找長度為5的元素的下標從小到大依次為_____________。(設下標從1開始)【答案】4,9,14,17,20 8.對于線性表(70,34,55,23,65,41,20,100)進行散列存儲時,若選用H(K)=K%9作為散列函數,則散列地址為1的元素有_____________個,散列地址為7的元素有_____________ 個。【答案】(1)2(2)2 9.索引順序表上的查找分兩個階段:_____________、_____________。【答案】(1)確定待查元素所在的塊(2)在塊內查找待查的元素

10.分塊查找中,要得到最好的平均查找長度,應對256個元素的線性查找表分成_____________塊,每塊的最佳長度是_____________。若每塊的長度為8,則等概率下平均查找長度為_____________。【答案】(1)16(2)16

(3)21 【解析】分塊查找的平均查找長度由兩部分組成——查找索引表確定所在塊的平均查找長度Lb和在塊中查找元素的平均查找長度Lw,即ASLbs=Lb+Lw=(b+s)/2+1,其中s為每塊的長度,b為所分的快數。由數學知識可知當s= 時,ASLbs可取得最小值 +1。因此,可得每塊的最佳長度是16,應將查找表分為16塊。若每塊的長度為8,則b=32,因此ASLbs=Lb+Lw=(b+s)/2+1=21。

11._____________是一棵二叉樹,如果不為空,則它必須滿足下面的條件: A)若左子樹不空,則左子樹上所有結點的值均小于根的值。B)若右子樹不空,則右子樹上所有結點的值均大于根的值。C)其左右子樹均為二叉排序樹。【答案】二叉排序樹

13.假定有k個關鍵字互為同義詞,若用線性探測法把這些同義詞存入散列表中,至少要進行_____________次探測。

【答案】1+2+3...+(k-1)+k=k(k+1)/2 【解析】在散列表的一連串連續空間內,第一個關鍵字只需探測一次,第二個就要探測2次,如此這般,第k個關鍵字就要探測k次才能找到位置存放。3 判斷題

1.對查找進行時間分析時,只需要考慮查找成功的平均情況。()【答案】×

【解析】大多數情況下,特別查找表中記錄數n很大時,查找不成功的概率可以忽略不計。但是,當查找不成功的情況不能忽視時,查找算法的平均查找長度應是查找成功時的平均查找長度與查找不成功時的平均查找長度之和。

2.在索引順序表上實現分塊查找,在等概率查找情況下,其平均查找長度不僅與表的個數有關,而且與每一塊中的元素個數有關。()【答案】√

3.構造一個好的哈希函數必須均勻,即沒有沖突。()【答案】×

【解析】一個好的哈希函數必須均勻,并不代表完全沒有沖突,而是盡量減少沖突。4.在一定情況下,有可能設計出無沖突的散列函數H。()【答案】√

5.二分查找只適用于有序表,包括有序的順序表和有序的鏈表。()【答案】×

【解析】二分查找只適用于順序表,而不能在鏈表結構中采用。因為鏈表查找都是從頭指針開始。6.對給定的關鍵字集合,以不同的次序插入初始為空的樹中,有可能得到同一棵二叉排序樹。()【答案】√

7.分塊查找適用于任何有序表或者無序表。()【答案】× 【解析】分塊查找適用于任何有序表或者分塊有序表,而不適用于任意的無序表。

8.在用線性探測法解決沖突所構造的散列表中,每組同義詞中至少有一個元素的地址正好等于其散列地址。()【答案】×

【解析】當存在堆積的沖突時,可能沒有一個元素地址等于其計算所得的散列地址。9.對一棵二叉排序樹中序遍歷一定得到一個關鍵字的有序序列。()【答案】√

10.所謂沖突即是兩個關鍵字的值相同的元素,其散列地址相同。()【答案】×

【解析】沖突是指兩個關鍵字的值不相同的元素,計算得到的散列地址相同。11.二叉判定樹和二叉排序樹一樣,都不是唯一的。()【答案】×

【解析】對于同一組結點,由于建立二叉排序樹時插入結點的先后次序不同,所構成的二叉排序樹的形態及深度也不同,所以含有n個結點的二叉排序樹不唯一。但二叉判定樹卻是唯一的。

12.若二叉樹中每個結點的值均大于其左孩子的值,小于其右孩子的值,則該二叉樹一定是二叉排序樹。()【答案】×

【解析】判定一棵二叉樹是否是二叉排序除上面兩個條件外,還必須滿足第三個條件,即其左右子樹也是二叉排序樹。

13.分塊查找中,每一塊的大小是相同的。()【答案】×

【解析】最末一塊,可以不是整塊,前面塊的大小必須相同。

14.對一個有序表作二分查找,查找每個元素所需的查找次數均比用順序查找所需的查找次數要少。()【答案】×

【解析】順序查找時最少的比較次數為1,它的比較次數小于位于二叉判定樹第二層以上的結點。二分查找時最多的比較次數為二叉判定樹的深度。

15.散列表的查找效率主要取決于所選擇的散列函數與處理沖突的方法。()【答案】√ 4 應用題

1.順序查找時間為O(n),二分法查找時間為O(log2n),散列法為O(1),為什么有高效率的查找方法而低效率的方法不被放棄? 【答案】不同的查找方法適用的范圍不同,高效率的查找方法并不是在所有情況下都比其他查找方法效率要高,而且也不是在所有情況下都可以采用。

2.對含有n個互不相同元素的集合,同時找最大元和最小元至少需進行多少次比較? 【答案】n-1次

【解析】設變量max和min用于存放最大元和最小元(的位置),第一次取兩個元素進行比較,大的放入max,小的放入min。從第2次開始,每次取一個元素先和max比較,如果大于max則以它替換max,并結束本次比較;若小于max則再與min相比較,在最好的情況下,比較下去都不用和min相比較,所以這種情況下,至少要進行n-1次比較就能找到最大元和最小元。

3.若對具有n個元素的有序的順序表和無序的順序表分別進行順序查找,試在下述兩種情況下分別討論兩者在等概率時的平均查找長度:

(1)查找不成功,即表中無關鍵字等于給定值K的記錄;(2)查找成功,即表中有關鍵字等于給定值K的記錄。【答案】

(1)不成功時需要n+1 次比較(2)成功時平均為(n+1)/2次

【解析】有序表和無序表順序查找時,都需要進行n+1次比較才能確定查找失敗。因此平均查找長度都為n+1。查找成功時,平均查找長度都為(n+1)/2,有序表和無序表也是一樣的。因為順序查找與表的初始序列狀態無關。

4.設有序表為(a, b, c, d, e, f, g, h, i, j, k, p, q),請分別畫出對給定值a, g和n進行折半查找的過程。【答案】

(1)查找a的過程如下(圓括號表示當前比較的關鍵字),經過三次比較,查找成功。

(2)g的查找過程如下,一次比較成功。

[a b c d e f(g)h i(3)n的查找過程如下,經過四次比較,查找失敗。

j k p q ]

5.為什么有序的單鏈表不能進行折半查找? 【答案】因為鏈表無法進行隨機訪問,如果要訪問鏈表的中間結點,就必須先從頭結點開始進行依次訪問,這就要浪費很多時間,還不如進行順序查找,而且,用鏈存儲結構將無法判定二分的過程是否結束,因此無法用鏈表實現二分查找。

6.構造有12個元素的二分查找的判定樹,并求解下列問題:(1)各元素的查找長度最大是多少?

(2)查找長度為1、2、3、4的元素各有多少?具體是哪些元素?(3)查找第5個元素依次要比較哪些元素? 【答案】12個元素的判斷樹如下圖所示:

(1)最大查找長度是樹的深度4。(2)查找長度為1的元素有1個,為第6個,查找長度為2的元素有2個,為第3個和第9個,查找長度為3的元素有4個,為第1、4、7、11個,查找長度為4的元素有5個,為第2、5、8、10、12個。(3)查找第五個元素依次比較6,3,4,5。

7.以數據集合{1,2,3,4,5,6}的不同序列為輸入,構造4棵高度為4的二叉排序樹。【答案】

圖(1)圖(2)

圖(3)圖(4)

8.直接在二叉排序樹中查找關鍵碼K與從中序遍歷輸出的有序序列中用二分查找法查找關鍵碼K,其數據比較次數是否相同? 【答案】不相同。

【解析】因為二分查找得到的判定樹和二叉排序樹的形狀不一定相同。9.已知一棵二叉排序樹如下:

(1)假如刪除關鍵字28,畫出新二叉樹。(2)若查找56,需和哪些關鍵字比較。【答案】(1)刪除元素28后,需修改二叉排序樹的形態,可用結點28左子樹上最大的結點代替它如圖(1),也可用其右子樹上最小的結點代替它,如圖(2)。

圖(1)圖(2)

2)若要查找56,需和38、49、55、56進行4次比較。

10.設散列函數為h(key)=key%101,解決沖突的方法為線性探測,表中用“-1”表示空單元。

(1)若刪去散列表HT中的304(即令HT[1]=-1)之后,在表HT中查找707將會發生什么?

(2)若將刪去的表項標記為“-2”,查找時探測到“-2”繼續向前搜索,探測到“-1”時終止搜索。請問用這種方法刪去304后能否正確地查找到707? 【答案】

(1)查找707時,首先根據散列函數計算得出該元素應在散列表中的0單元,但是在0單元沒有找到,因此將向下一單元探測,結果發現該單元是-1(為空單元),所以結束查找,這將導致707無法找到。(2)如果改用“-2”作為刪除標記,則可以正確找到707所在的結點。

11.已知散列表的地址區間為0~11,散列函數為H(k)=k % 11,采用線性探測法處理沖突,將關鍵字序列20,30,70,15,8,12,18,63,19依次存儲到散列表中,試構造出該散列表,并求出在等概率情況下的平均查找長度。

【答案】構造散列表如下(每個元素的查找長度標注在該元素的下方)。

等概率情況下成功時的平均查找長度為(1×5+2+3+4+5)/9=19/9 12.設散列函數為H(k)=k % 11,采用拉鏈法處理沖突,將上例中關鍵字序列依次存儲到散列表中,并求出在等概率情況下的平均查找長度。【答案】

在等概率情況下成功的平均查找長度為:(1*5+2*2+3*1+4*1)/9=16/9 13.假定一個待散列存儲的線性表為(32,75,29,63,48,94,25,46,18,70),散列地址空間為HT[13],若采用除留余數法構造散列函數和線性探測法處理沖突,試求出每一元素的初始散列地址和最終散列地址,畫出最后得到的散列表,求出平均查找長度。【答案】

構造的散列表如下:

在等概率情況下成功的平均查找長度為(1*7+2*5+3*1+4*1)/14=24/14 14.散列表的地址區間為0~15,散列函數為H(key)=key%13。設有一組關鍵字{19,01,23,14,55,20,84}, 采用線性探測法解決沖突,依次存放在散列表中。問:(1)元素84存放在散列表中的地址是多少?(2)搜索元素84需要的比較次數是多少? 【答案】構造的散列表如下:

(1)元素84存放在散列表中的地址是8。(2)搜索元素84需要的比較3次。

第9章 排序 選擇題

1.從末排序的序列中依次取出一個元素與已排序序列中的元素依次進行比較,然后將其放在排序序列的合適位置,該排序方法稱為()排序法。A)插入 B)選擇 C)希爾 D)二路歸并 【答案】A 2.下面各種排序方法中,最好情況下時間復雜度為O(n)的是()A)快速排序 B)直接插入排序 C)堆排序 D)歸并排序 【答案】B 3.用某種排序方法對線性表(25,84,21,47,15,27,68,35,20)進行排序時,無序序列的變化情況如下: 25 84 21 47 15 27 68 35 20 20 15 21 25 47 27 68 35 84 15 20 21 25 35 27 47 68 84 15 20 21 25 27 35 47 68 84 則所采用的排序方法是()

A)選擇排序

B)希爾排序

C)歸并排序

D)快速排序 【答案】D

4.下面給出的四種排序法中,()排序是不穩定排序法。A)插入 B)冒泡 C)二路歸并 D)堆 【答案】D 5.快速排序方法在()情況下最不利于發揮其長處。A)要排序的數據量太大

B)要排序的數據中含有多個相同值 C)要排序的數據已基本有序 D)要排序的數據個數為奇數 【答案】C

6.一組記錄的關鍵碼為(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 【答案】C

7.對記錄的關鍵碼{50,26,38,80,70,90,8,30,40,20}進行排序,各趟排序結束時的結果為: 50,26,38,80,70,90 ,8,30,40,20 50,8,30,40,20,90,26,38,80,70 26,8,30,40,20,80,50,38,90,70 8,20,26,30,38,40,50,70,80,90 其使用的排序方法是()

A)快速排序 B)基數排序 C)希爾排序 D)歸并排序 【答案】C 8.在文件“局部有序”或文件長度較小的情況下,最佳內部排序方法是()A)直接插入排序 B)冒泡排序 C)簡單選擇排序 D)歸并排序 【答案】A 【解析】當待排序列基本有序時,對冒泡排序來說,若最大關鍵字位于序列首部,則每趟排序僅能使其“下沉”一個位置,要使其下沉到底部仍需n-1趟排序,也即時間復雜度仍為O(n)。而對簡單選擇排序來說,其比較次數與待排序列的初始狀態無關;歸并排序要求待排序列已經部分有序,而部分有序的含義是待排序列由若干有序的子序列組成,即每個子序列必須有序,并且其時間復雜度為O(n log2);直接插入排序在待排序列基本有序時,每趟的比較次數大為降低,也即n-1趟比較的時間復雜度由O(n)降至O(n)。9.在下列算法中,()算法可能出現下列情況:在最后一趟開始之前,所有的元素都不在其最終的位置上。

A)堆排序 B)冒泡排序 C)插入排序 D)快速排序 【答案】C 【解析】在插入排序中,如果待排序列中的最后一個元素其關鍵字值為最小,則在最后一趟開始之前,前n-1個排好序的元素都不在其最終位置上,與排好序后的位置相差一個位置。因此,選C。

10.設有5000個無序的元素,希望用最快速度挑選出其中前10個最大的元素,在以下的排序方法中,采用()方法最好

A)快速排序 B)堆排序 C)希爾排序 【答案】B 【解析】用堆排序最好,因為堆排序不需要等整個排序結束就可挑出前10個最大元素,而快速排序和希爾排序都需等待整個排序結束才能知道前10個最大元素。

11.對給出的一組關鍵字{14,5,19,20,11,19}。若按關鍵字非遞減排序,第一趟排序結果為{14,5,19,20,11,19},問采用的排序算法是()

A)簡單選擇排序 B)快速排序 C)希爾排序 D)二路歸并排序 【答案】C 12.以下序列不是堆的是()A)100,85,98,77,80,60,82,40,20,10,66 B)100,98,85,82,80,77,66,60,40,20,10 C)10,20,40,60,66,77,80,82,85,98,100 D)100,85,40,77,80,60,66,98,82,10,20 【答案】D 【解析】根據堆采用完全二叉樹的順序存儲形式及堆的特點,因第一個結點即根結點關鍵字值最大,則應建立一個大根堆,但依據此數據序列建立起堆后關鍵字值為40的左右孩子結點分別為60、66,不符合大根堆特點。

13.下面排序方法中,關鍵字比較次數與記錄的初始排列無關的是()A)希爾排序 B)冒泡排序 C)直接插入排序 D)直接選擇排序 【答案】D 【解析】如果初始排列基本有序,則對希爾排序來說,前幾趟的插入工作大為減少。冒泡排序和直接插入

2n

2排序都與初始排序序列有關,只有直接選擇排序與初始序列無關.故選D。

14.一組記錄的關鍵字為{45,80,55,40,42,85},則利用堆排序的方法建立的初始堆為()A)80,45,50,40,42,85 B)85,80,55,40,42, 45 C)85,80,55,45,42,40 D)85,55,80,42,45,40 【答案】B 15.一組記錄的關鍵字為{25,50,15,35,80,85,20,40,36,70},其中含有5個長度為2的有序表,用歸并排序方法對該序列進行一趟歸并后的結果為()A)15,25,35,50,20,40,80,85,36,70 B)15,25,35,50,80,20,85,40,70,36 C)15,25,50,35,80,85,20,36,40,70 D)15,25,35,50,80,20,36,40,70,85 【答案】A 【解析】對5個長度為2的有序表一趟歸并后得到前兩個長度為4的有序表和最后一個長度為2的有序表,故選A。

16.n個元素進行冒泡排序的過程中,最好情況下的時間復雜度為()A)O(1)B)O(log2)C)O(n)D)O(n)【答案】D 【解析】最好情況下至少需要一趟排序,即比較n-1次,故選D。

17.n個元素進行快速排序的過程中,第一次劃分最多需要移動()次元素(包括開始將基準元素移到臨時變量的那一次)。

A)n/2 B)n-1 C)n D)n+l 【答案】D 【解析】移動次數最多的情況是對n-1個元素比較時都需移動,加上開始將基準元素移到臨時變量以及由臨時變量移至正確位置的二次,即共需n+1次,故選D。18.下述幾種排序方法中,要求內存量最大的是()A)插入排序 B)選擇排序 C)快速排序 D)歸并排序 【答案】D 【解析】插入排序和選擇排序需要的輔助空間為O(1),快速排序需要的輔助空間為O(log2),歸并排序需要的輔助空間為O(n),因此選D。

19.下面排序方法中,時間復雜度不是O(n)的是()

A)直接插入排序 B)二路歸并排序 C)冒泡排序 D)直接選擇排序 【答案】B 【解析】直接插入排序、冒泡排序和直接選擇排序的時間復雜度為O(n),而二路歸并排序的時間復雜度為O(n log2),故選B。

20.對下列4個序列用快速排序方法進行排序,以序列的第1個元素為基準進行劃分。在第1趟劃分過程中,元素移動次數最多的是序列()A)70,75,82,90, 23,16,10,68 B)70,75,68,23,10,16,90,82 C)82,75,70,16,10,90,68,23 D)23,10,16,70,82,75,68,90 【答案】A 【解析】快速排序第一趟劃分的方法是:將第1個元素放入最終排好序序列中的正確位置上,則在這個位n

2nn

2置右邊小于該元素值的元素都將移到其左邊,在這個位置左邊大于該元素值的元素都將其移到其右邊。由此得到A需移動的元素最多,故選A。2 填空題

1.當數據量特別大需借助外部存儲器對數據進行排序,則這種排序稱為_____________。【答案】外部排序

2.在堆排序、快速排序和歸并排序中,若從節省存儲空間考慮,則應首先選取_____________方法,其次選取_____________方法;若只從排序結果的穩定性考慮,則應先擇_____________方法;若只從平均情況下排序的速度來考慮,則選擇_____________方法;若只從最壞情況下排序最快并且要節省內存考慮,則應選取_____________方法。

【答案】(1)堆排序

(2)快速排序

(3)歸并排序(4)快速(5)堆

3.對n個元素的序列進行冒泡排序,最少的比較次數是_____________,此時元素的排列情況為_____________,在_____________情況下比較次數最多,其比較次數為_____(4)_ ____。【答案】

(1)n-1(2)從小到大排序(3)元素從大到小排列(4)n(n-1)/2 【解析】初始元素正序時,第一趟比較n-1次,并無數據交換,則不再比較,故只比較n-1次。若反序,則比較(n-1)+(n-2)+(n-3)+?..+2+1共n(n-1)/2次。

4.希爾排序是把記錄按下標的一定增量分組,對每組記錄進行直接插入排序,隨著增量_____________,所分成的組包含的記錄越來越多,當增量的值為_____________時,整個數組合為一組。【答案】(1)減少

(2)1 5.直接插入排序需借助的存儲單元個數(空間復雜度)為_____________,最好情況下直接插入排序的算法時間復雜度為_____________,最壞情況下該算法的時間復雜度為_____________。【答案】(1)1(2)O(n)(3)O(n)6.對n個數據進行簡單選擇排序,所需進行的關鍵字間的比較次數為_____________,時間復雜度為_____________。

【答案】(1)n(n-1)/2(2)O(n)7.對于關鍵字序列(12,13,11,18,60,15,7,20,25,100),用篩選法建堆,必須從鍵值為_____________的關鍵字開始。【答案】60 【解析】建堆必須從n/2結點開始,而10/2=5位置的結點值為60,故填60。

8.對一組記錄(54,38,96,23,15,72,60,45,83)進行直接插入排序時,當把第7個記錄60插入到已排序的有序表時,為尋找其插入位置需比較_____________次。【答案】3 【解析】當把第7個記錄60插入到有序表時,則前6個記錄已經有序,此時記錄60由后向前與有序表中的元素進行比較,直到遇到值小于60的記錄為止,也即在有序表(15,23,38,54,72,96)中共需比較3次,因此填3。

9.若對順序存儲在A[l]~A[9]的記錄(76,38,62,53,80,74,83,65,85)進行堆排序,已知除第一個元素76外,以其余元素為根的結點都已是堆,則對第一個元素進行篩運算時,它將最終被篩到A數組下標為_____________的位置上。【答案】8 【解析】從樹結構關鍵字值看,除根外是小根堆。對第一元素進行篩運算時,得到的數據序列為:38,53,62,65,80,74,83,76,85。

11.在時間復雜度為O(log2)的排序方法中,_____________排序方法是穩定的;在時間復雜度為O(n)的排序方法中,_____________排序方法是不穩定的。n

22【答案】(1)歸并

(2)直接選擇

12.設表中元素的初態是按鍵值遞增的,若分別用堆排序、快速排序、冒泡排序和歸并排序方法對其仍按遞增順序進行排序,則_____________最省時間,_____________最費時間。【答案】(1)冒泡排序

(2)快速排序

【解析】若初始序列已經有序,則冒泡排序僅需一趟(比較n-1次);而快速排序則需n-1趟,其時間復雜度升至O(n)。因此填:冒泡排序,快速排序。

13.從一個無序序列建立一個堆的方法是:首先將要排序的n個鍵值分放到一棵______________的各個結點中,然后從i=_____________的結點Ki開始,逐步把以Ki-

1、Ki-

2、?、K1為根的子樹排成堆,直到以Kl為根的樹排成堆,就完成了建堆的過程。【答案】(1)完全二叉樹(2)n/2下取整。

14.在歸并排序中,若待排序記錄的個數為20,則共需要進行_____________趟歸并,在第三趟歸并中,是把長度為_____________的有序表歸并為長度為_____________的有序表。【答案】(1)5(2)4(3)8 【解析】第一次把長度為1的歸并為長度的2的子表共10個,第二次把長度為2的歸并成長度為4的子表共5個,第三次把長度為4的歸并為長度為8的共3個,第四次長度為8歸并為長度為16的,第5次歸并成一個有序表。3 判斷題

1.對一個堆,按二叉樹層次進行遍歷可以得到一個有序序列()【答案】×

【解析】堆的定義只規定了結點與其左、右孩子結點間的大小關系,而同一層上屬不同父母的結點之間并無明確的大小關系,所以堆的層次遍歷并不能得到一個有序序列。2.內部排序就是整個排序過程完全在內存中進行的排序()【答案】√

3.在數據基本有序時,直接插入排序法一定是性能最好的算法()【答案】×

【解析】在數據量較少且數據基本有序時,直接插入法性能較好,但當數據量大時,則該算法的性能會大大降低。

4.當數據序列已有序時,若采用冒泡排序法,數據比較n-1次()【答案】√

5.內排序中的快速排序方法,在任何情況下均可得到最快的排序效果()【答案】×

【解析】快速排序在待排序記錄為隨機分布時效果最好,基本有序時效果最差。6.用希爾方法排序時,若關鍵字的初始排序雜亂無序,則排序效率就低()【答案】×

【解析】希爾排序又稱“縮小增量排序”,即每趟只對相同增量距離的關鍵字進行比較,這與關鍵字序列初始有序或無序無關。

7.有一小根堆,堆中任意結點的關鍵字均小于它的左、右孩子關鍵字。則其具有最大值的結點一定是一個葉結點并可能在堆的最后兩層中()【答案】√

8.對n個記錄的集合進行歸并排序,在最壞情況下所需要的時間是O(n)()【答案】×

【解析】歸并排序不受記錄初始序列的影響,即所謂的最壞情況,其所需時間也是O(nlog2)。9.對n個記錄的集合進行冒泡排序,在最壞情況下所需要的時間是O(n)()

n

第二篇:數據結構習題與答案

第 1 章 緒 論

課后習題講解

1.填空

⑴()是數據的基本單位,在計算機程序中通常作為一個整體進行考慮和處理。【解答】數據元素

⑵()是數據的最小單位,()是討論數據結構時涉及的最小數據單位。【解答】數據項,數據元素

【分析】數據結構指的是數據元素以及數據元素之間的關系。

⑶ 從邏輯關系上講,數據結構主要分為()、()、()和()。【解答】集合,線性結構,樹結構,圖結構

⑷ 數據的存儲結構主要有()和()兩種基本方法,不論哪種存儲結構,都要存儲兩方面的內容:()和()。

【解答】順序存儲結構,鏈接存儲結構,數據元素,數據元素之間的關系

⑸ 算法具有五個特性,分別是()、()、()、()、()。【解答】有零個或多個輸入,有一個或多個輸出,有窮性,確定性,可行性

⑹ 算法的描述方法通常有()、()、()和()四種,其中,()被稱為算法語言。【解答】自然語言,程序設計語言,流程圖,偽代碼,偽代碼

⑺ 在一般情況下,一個算法的時間復雜度是()的函數。【解答】問題規模

⑻ 設待處理問題的規模為n,若一個算法的時間復雜度為一個常數,則表示成數量級的形式為(),若為n*log25n,則表示成數量級的形式為()。【解答】Ο(1),Ο(nlog2n)

【分析】用大O記號表示算法的時間復雜度,需要將低次冪去掉,將最高次冪的系數去掉。2.選擇題

⑴ 順序存儲結構中數據元素之間的邏輯關系是由()表示的,鏈接存儲結構中的數據元素之間的邏輯關系是由()表示的。

A 線性結構 B 非線性結構 C 存儲位置 D 指針 【解答】C,D

【分析】順序存儲結構就是用一維數組存儲數據結構中的數據元素,其邏輯關系由存儲位置(即元素在數組中的下標)表示;鏈接存儲結構中一個數據元素對應鏈表中的一個結點,元素之間的邏輯關系由結點中的指針表示。⑵ 假設有如下遺產繼承規則:丈夫和妻子可以相互繼承遺產;子女可以繼承父親或母親的遺產;子女間不能相互繼承。則表示該遺產繼承關系的最合適的數據結構應該是()。A 樹 B 圖 C 線性表 D 集合 【解答】B 【分析】將丈夫、妻子和子女分別作為數據元素,根據題意畫出邏輯結構圖。

⑶ 算法指的是()。

A 對特定問題求解步驟的一種描述,是指令的有限序列。B 計算機程序 C 解決問題的計算方法 D 數據處理 【解答】A 【分析】計算機程序是對算法的具體實現;簡單地說,算法是解決問題的方法;數據處理是通過算法完成的。所以,只有A是算法的準確定義。⑷ 下面()不是算法所必須具備的特性。A 有窮性 B 確切性 C 高效性 D 可行性 【解答】C

【分析】高效性是好算法應具備的特性。

⑸ 算法分析的目的是(),算法分析的兩個主要方面是()。A 找出數據結構的合理性 B 研究算法中輸入和輸出的關系 C 分析算法的效率以求改進 D 分析算法的易讀性和文檔性

E 空間性能和時間性能 F 正確性和簡明性

G 可讀性和文檔性 H 數據復雜性和程序復雜性 【解答】C,E 3.判斷題

⑴ 算法的時間復雜度都要通過算法中的基本語句的執行次數來確定。【解答】錯。時間復雜度要通過算法中基本語句執行次數的數量級來確定。⑵ 每種數據結構都具備三個基本操作:插入、刪除和查找。

【解答】錯。如數組就沒有插入和刪除操作。此題注意是每種數據結構。

⑶ 所謂數據的邏輯結構指的是數據之間的邏輯關系。【解答】錯。是數據之間的邏輯關系的整體。

⑷ 邏輯結構與數據元素本身的內容和形式無關。【解答】對。因此邏輯結構是數據組織的主要方面。⑸ 基于某種邏輯結構之上的基本操作,其實現是唯一的。

【解答】錯。基本操作的實現是基于某種存儲結構設計的,因而不是唯一的。4.分析以下各程序段,并用大O記號表示其執行時間。

【解答】⑴ 基本語句是k=k+10*i,共執行了n-2次,所以T(n)=O(n)。

⑵ 基本語句是k=k+10*i,共執行了n次,所以T(n)=O(n)。

⑶ 分析條件語句,每循環一次,i+j 整體加1,共循環n次,所以T(n)=O(n)。

⑷ 設循環體共執行T(n)次,每循環一次,循環變量y加1,最終T(n)=y,即:

(T(n)+1)2≤n,所以T(n)=O(n1/2)。

⑸ x++是基本語句,所以

5.設有數據結構(D,R),其中D={1, 2, 3, 4, 5, 6},R={(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)}。試畫出其邏輯結構圖并指出屬于何種結構。

【解答】其邏輯結構圖如圖1-3所示,它是一種圖結構。

6.為整數定義一個抽象數據類型,包含整數的常見運算,每個運算對應一個基本操作,每個基本操作的接口需定義前置條件、輸入、功能、輸出和后置條件。【解答】整數的抽象數據類型定義如下:

ADT integer Data 整數a:可以是正整數(1, 2, 3, …)、負整數(-1,-2,-3, …)和零 Operation Constructor

前置條件:整數a不存在輸入:一個整數b

功能:構造一個與輸入值相同的整數 輸出:無

后置條件:整數a具有輸入的值

Set 前置條件:存在一個整數a 輸入:一個整數b

功能:修改整數a的值,使之與輸入的整數值相同

輸出:無

后置條件:整數a的值發生改變

Add

前置條件:存在一個整數a 輸入:一個整數b

功能:將整數a與輸入的整數b相加

輸出:相加后的結果

后置條件:整數a的值發生改變

Sub

前置條件:存在一個整數a 輸入:一個整數b

功能:將整數a與輸入的整數b相減

輸出:相減的結果

后置條件:整數a的值發生改變

Multi

前置條件:存在一個整數a 輸入:一個整數b

功能:將整數a與輸入的整數b相乘

輸出:相乘的結果

后置條件:整數a的值發生改變 Div

前置條件:存在一個整數a 輸入:一個整數b

功能:將整數a與輸入的整數b相除

輸出:若整數b為零,則拋出除零異常,否則輸出相除的結果

后置條件:整數a的值發生改變

Mod

前置條件:存在一個整數a 輸入:一個整數b

功能:求當前整數與輸入整數的模,即正的余數

輸出:若整數b為零,則拋出除零異常,否則輸出取模的結果

后置條件:整數a的值發生改變 Equal

前置條件:存在一個整數a 輸入:一個整數b

功能:判斷整數a與輸入的整數b是否相等

輸出:若相等返回1,否則返回0 后置條件:整數a的值不發生改變

endADT

7.求多項式A(x)的算法可根據下列兩個公式之一來設計:

⑴ A(x)=anxn+an-1xn-1+…+a1x+a0 ⑵ A(x)=(…(anx+an-1)x+…+a1)x)+a0

根據算法的時間復雜度分析比較這兩種算法的優劣。

【解答】第二種算法的時間性能要好些。第一種算法需執行大量的乘法運算,而第二種算法進行了優化,減少了不必要的乘法運算。

8.算法設計(要求:算法用偽代碼和C++描述,并分析最壞情況下的時間復雜度)⑴ 對一個整型數組A[n]設計一個排序算法。【解答】下面是簡單選擇排序算法的偽代碼描述。

下面是簡單選擇排序算法的C++描述。

分析算法,有兩層嵌套的for循環,所以。

⑵ 找出整型數組A[n]中元素的最大值和次最大值。【解答】算法的偽代碼描述如下:

算法的C++描述如下:

分析算法,只有一層循環,共執行n-2次,所以,T(n)=O(n)。

學習自測及答案

1.順序存儲結構的特點是(),鏈接存儲結構的特點是()。

【解答】用元素在存儲器中的相對位置來表示數據元素之間的邏輯關系,用指示元素存儲地址的指針表示數據元素之間的邏輯關系。

2.算法在發生非法操作時可以作出處理的特性稱為()。【解答】健壯性

3.常見的算法時間復雜度用大O記號表示為:常數階()、對數階()、線性階()、平方階()和指數階()。【解答】O(1),O(log2n),O(n),O(n2),O(2n)4.將下列函數按它們在n 時的無窮大階數,從小到大排列。

n, n-n3+7n5, nlogn, 2n/2, n3, log2n, n1/2+log2n,(3/2)n, n!, n2+log2n

【解答】log2n, n1/2+log2n, n, nlog2n, n2+log2n, n3, n-n3+7n5, 2n/2,(3/2)n, n!5.試描述數據結構和抽象數據類型的概念與程序設計語言中數據類型概念的區別。

【解答】數據結構是指相互之間存在一定關系的數據元素的集合。而抽象數據類型是指一個數據結構以及定義在該結構上的一組操作。程序設計語言中的數據類型是一個值的集合和定義在這個值集上一組操作的總稱。抽象數據類型可以看成是對數據類型的一種抽象。

6.對下列用二元組表示的數據結構,試分別畫出對應的邏輯結構圖,并指出屬于何種結構。

⑴ A=(D,R),其中D={a1, a2, a3, a4},R={ } ⑵ B=(D,R),其中D={a, b, c, d, e, f},R={,,} ⑶ C=(D,R),其中D={a,b,c,d,e,f},R={,,,} ⑷ D=(D,R),其中D={1, 2, 3, 4, 5, 6},R={(1, 2),(1, 4),(2, 3),(2, 4),(3, 4),(3, 5),(3, 6),(4, 6)}

【解答】⑴ 屬于集合,其邏輯結構圖如圖1-4(a)所示;⑵ 屬于線性結構,其邏輯結構圖如圖1-4(b)所示;⑶ 屬于樹結構,其邏輯結構圖如圖1-4(c)所示;⑷ 屬于圖結構,其邏輯結構圖如圖1-4(d)所示。

7.求下列算法的時間復雜度。count=0;x=1;while(x { x*=2;count++;} return count;【解答】O(log2n)

第 2 章 線性表

課后習題講解 1.填空

⑴ 在順序表中,等概率情況下,插入和刪除一個元素平均需移動()個元素,具體移動元素的個數與()和()有關。

【解答】表長的一半,表長,該元素在表中的位置

⑵ 順序表中第一個元素的存儲地址是100,每個元素的長度為2,則第5個元素的存儲地址是()。【解答】108 【分析】第5個元素的存儲地址=第1個元素的存儲地址+(5-1)×2=108 ⑶ 設單鏈表中指針p 指向結點A,若要刪除A的后繼結點(假設A存在后繼結點),則需修改指針的操作為()。

【解答】p->next=(p->next)->next ⑷ 單鏈表中設置頭結點的作用是()。【解答】為了運算方便

【分析】例如在插入和刪除操作時不必對表頭的情況進行特殊處理。

⑸ 非空的單循環鏈表由頭指針head指示,則其尾結點(由指針p所指)滿足()。【解答】p->next=head 【分析】如圖2-8所示。

⑹ 在由尾指針rear指示的單循環鏈表中,在表尾插入一個結點s的操作序列是();刪除開始結點的操作序列為()。

【解答】s->next =rear->next;rear->next =s;rear =s;q=rear->next->next;rear->next->next=q->next;delete q;【分析】操作示意圖如圖2-9所示:

⑺ 一個具有n個結點的單鏈表,在指針p所指結點后插入一個新結點的時間復雜度為();在給定值為x的結點后插入一個新結點的時間復雜度為()。【解答】Ο(1),Ο(n)

【分析】在p所指結點后插入一個新結點只需修改指針,所以時間復雜度為Ο(1);而在給定值為x的結點后插入一個新結點需要先查找值為x的結點,所以時間復雜度為Ο(n)。⑻ 可由一個尾指針唯一確定的鏈表有()、()、()。【解答】循環鏈表,循環雙鏈表,雙鏈表 2.選擇題

⑴ 線性表的順序存儲結構是一種()的存儲結構,線性表的鏈接存儲結構是一種()的存儲結構。

A 隨機存取 B 順序存取 C 索引存取 D 散列存取 【解答】A,B 【分析】參見2.2.1。

⑵ 線性表采用鏈接存儲時,其地址()。

A 必須是連續的B 部分地址必須是連續的 C 一定是不連續的 D 連續與否均可以 【解答】D 【分析】線性表的鏈接存儲是用一組任意的存儲單元存儲線性表的數據元素,這組存儲單元可以連續,也可以不連續,甚至可以零散分布在內存中任意位置。⑶ 單循環鏈表的主要優點是()。A 不再需要頭指針了

B 從表中任一結點出發都能掃描到整個鏈表;

C 已知某個結點的位置后,能夠容易找到它的直接前趨; D 在進行插入、刪除操作時,能更好地保證鏈表不斷開。【解答】B ⑷ 鏈表不具有的特點是()。

A 可隨機訪問任一元素 B 插入、刪除不需要移動元素 C 不必事先估計存儲空間 D 所需空間與線性表長度成正比 【解答】A

⑸ 若某線性表中最常用的操作是取第i 個元素和找第i個元素的前趨,則采用()存儲方法最節省時間。A 順序表 B 單鏈表 C 雙鏈表 D 單循環鏈表 【解答】A 【分析】線性表中最常用的操作是取第i 個元素,所以,應選擇隨機存取結構即順序表,同時在順序表中查找第i個元素的前趨也很方便。單鏈表和單循環鏈表既不能實現隨機存取,查找第i個元素的前趨也不方便,雙鏈表雖然能快速查找第i個元素的前趨,但不能實現隨機存取。

⑹ 若鏈表中最常用的操作是在最后一個結點之后插入一個結點和刪除第一個結點,則采用()存儲方法最節省時間。

A 單鏈表 B 帶頭指針的單循環鏈表 C 雙鏈表 D 帶尾指針的單循環鏈表 【解答】D 【分析】在鏈表中的最后一個結點之后插入一個結點需要知道終端結點的地址,所以,單鏈表、帶頭指針的單循環鏈表、雙鏈表都不合適,考慮在帶尾指針的單循環鏈表中刪除第一個結點,其時間性能是O(1),所以,答案是D。⑺ 若鏈表中最常用的操作是在最后一個結點之后插入一個結點和刪除最后一個結點,則采用()存儲方法最節省運算時間。

A 單鏈表 B 循環雙鏈表 C單循環鏈表

D 帶尾指針的單循環鏈表 【解答】B 【分析】在鏈表中的最后一個結點之后插入一個結點需要知道終端結點的地址,所以,單鏈表、單循環鏈表都不合適,刪除最后一個結點需要知道終端結點的前驅結點的地址,所以,帶尾指針的單循環鏈表不合適,而循環雙鏈表滿足條件。

⑻ 在具有n個結點的有序單鏈表中插入一個新結點并仍然有序的時間復雜度是()。A O(1)B O(n)C O(n2)D O(nlog2n)【解答】B 【分析】首先應順序查找新結點在單鏈表中的位置。

⑼ 對于n個元素組成的線性表,建立一個有序單鏈表的時間復雜度是()。A O(1)B O(n)C O(n2)D O(nlog2n)【解答】C 【分析】該算法需要將n個元素依次插入到有序單鏈表中,而插入每個元素需O(n)。⑽ 使用雙鏈表存儲線性表,其優點是可以()。A 提高查找速度 B 更方便數據的插入和刪除 C 節約存儲空間 D 很快回收存儲空間 【解答】B 【分析】在鏈表中一般只能進行順序查找,所以,雙鏈表并不能提高查找速度,因為雙鏈表中有兩個指針域,顯然不能節約存儲空間,對于動態存儲分配,回收存儲空間的速度是一樣的。由于雙鏈表具有對稱性,所以,其插入和刪除操作更加方便。

⑾ 在一個單鏈表中,已知q所指結點是p所指結點的直接前驅,若在q和p之間插入s所指結點,則執行()操作。

A s->next=p->next;p->next=s;B q->next=s;s->next=p;C p->next=s->next;s->next=p;D p->next=s;s->next=q;【解答】B 【分析】注意此題是在q和p之間插入新結點,所以,不用考慮修改指針的順序。⑿ 在循環雙鏈表的p所指結點后插入s所指結點的操作是()。A p->next=s;s->prior=p;p->next->prior=s;s->next=p->next;B p->next=s;p->next->prior=s;s->prior=p;s->next=p->next;C s->prior=p;s->next=p->next;p->next=s;p->next->prior=s;D s->prior=p;s->next=p->next;p->next->prior=s;p->next=s 【解答】D 【分析】在鏈表中,對指針的修改必須保持線性表的邏輯關系,否則,將違背線性表的邏輯特征,圖2-10給出備選答案C和D的圖解。

3.判斷題

⑴ 線性表的邏輯順序和存儲順序總是一致的。

【解答】錯。順序表的邏輯順序和存儲順序一致,鏈表的邏輯順序和存儲順序不一定一致。⑵ 線性表的順序存儲結構優于鏈接存儲結構。【解答】錯。兩種存儲結構各有優缺點。⑶ 設p,q是指針,若p=q,則*p=*q。

【解答】錯。p=q只能表示p和q指向同一起始地址,而所指類型則不一定相同。⑷ 線性結構的基本特征是:每個元素有且僅有一個直接前驅和一個直接后繼。

【解答】錯。每個元素最多只有一個直接前驅和一個直接后繼,第一個元素沒有前驅,最后一個元素沒有后繼。

⑸ 在單鏈表中,要取得某個元素,只要知道該元素所在結點的地址即可,因此單鏈表是隨機存取結構。【解答】錯。要找到該結點的地址,必須從頭指針開始查找,所以單鏈表是順序存取結構。4.請說明順序表和單鏈表各有何優缺點,并分析下列情況下,采用何種存儲結構更好些。

⑴ 若線性表的總長度基本穩定,且很少進行插入和刪除操作,但要求以最快的速度存取線性表中的元素。⑵ 如果n個線性表同時并存,并且在處理過程中各表的長度會動態發生變化。⑶ 描述一個城市的設計和規劃。

【解答】順序表的優點:① 無需為表示表中元素之間的邏輯關系而增加額外的存儲空間;② 可以快速地存取表中任一位置的元素(即隨機存取)。順序表的缺點:① 插入和刪除操作需移動大量元素;② 表的容量難以確定;③ 造成存儲空間的―碎片‖。

單鏈表的優點:① 不必事先知道線性表的長度;② 插入和刪除元素時只需修改指針,不用移動元素。單鏈表的缺點:① 指針的結構性開銷;② 存取表中任意元素不方便,只能進行順序存取。

⑴ 應選用順序存儲結構。因為順序表是隨機存取結構,單鏈表是順序存取結構。本題很少進行插入和刪除操作,所以空間變化不大,且需要快速存取,所以應選用順序存儲結構。

⑵ 應選用鏈接存儲結構。鏈表容易實現表容量的擴充,適合表的長度動態發生變化。

⑶ 應選用鏈接存儲結構。因為一個城市的設計和規劃涉及活動很多,需要經常修改、擴充和刪除各種信息,才能適應不斷發展的需要。而順序表的插入、刪除的效率低,故不合適。5.算法設計 ⑴ 設計一個時間復雜度為O(n)的算法,實現將數組A[n]中所有元素循環右移k個位置。【解答】算法思想請參見主教材第一章思想火花。下面給出具體算法。

分析算法,第一次調用Reverse函數的時間復雜度為O(k),第二次調用Reverse函數的時間復雜度為O(n-k),第三次調用Reverse函數的時間復雜度為O(n),所以,總的時間復雜度為O(n)。

⑵ 已知數組A[n]中的元素為整型,設計算法將其調整為左右兩部分,左邊所有元素為奇數,右邊所有元素為偶數,并要求算法的時間復雜度為O(n)。

【解答】從數組的兩端向中間比較,設置兩個變量i和j,初始時i=0,j=n-1,若A[i]為偶數并且A[j]為奇數,則將A[i]與A[j]交換。具體算法如下:

分析算法,兩層循環將數組掃描一遍,所以,時間復雜度為O(n)。

⑶ 試編寫在無頭結點的單鏈表上實現線性表的插入操作的算法,并和帶頭結點的單鏈表上的插入操作的實現進行比較。【解答】參見2.2.3。

⑷ 試分別以順序表和單鏈表作存儲結構,各寫一實現線性表就地逆置的算法。

【解答】順序表的逆置,即是將對稱元素交換,設順序表的長度為length,則將表中第i個元素與第length-i-1個元素相交換。具體算法如下:

單鏈表的逆置請參見2.2.4算法2-4和算法2-6。

⑸ 假設在長度大于1的循環鏈表中,即無頭結點也無頭指針,s為指向鏈表中某個結點的指針,試編寫算法刪除結點s的前趨結點。

【解答】利用單循環鏈表的特點,通過指針s可找到其前驅結點r以及r的前驅結點p,然后將結點r刪除,如圖2-11所示,具體算法如下:

⑹ 已知一單鏈表中的數據元素含有三類字符:字母、數字和其他字符。試編寫算法,構造三個循環鏈表,使每個循環鏈表中只含同一類字符。

【解答】在單鏈表A中依次取元素,若取出的元素是字母,把它插入到字母鏈表B 中,若取出的元素是數字,則把它插入到數字鏈表D中,直到鏈表的尾部,這樣表B,D,A中分別存放字母、數字和其他字符。具體算法如下:

⑺ 設單鏈表以非遞減有序排列,設計算法實現在單鏈表中刪去值相同的多余結點。

【解答】從頭到尾掃描單鏈表,若當前結點的元素值與后繼結點的元素值不相等,則指針后移;否則刪除該后繼結點。具體算法如下:

⑻ 判斷帶頭結點的雙循環鏈表是否對稱。

【解答】設工作指針p和q分別指向循環雙鏈表的開始結點和終端結點,若結點p和結點q的數據域相等,則工作指針p后移,工作指針q前移,直到指針p和指針q指向同一結點(循環雙鏈表中結點個數為奇數),或結點q成為結點p的前驅(循環雙鏈表中結點個數為偶數)。如圖2-12所示。

學習自測及答案

1.已知一維數組A采用順序存儲結構,每個元素占用4個存儲單元,第9個元素的地址為144,則第一個元素的地址是()。A 108 B 180 C 176 D 112 【解答】D 2.在長度為n的線性表中查找值為x的數據元素的時間復雜度為:()。

A O(0)B O(1)C O(n)D O(n2)【解答】C 3.在一個長度為n的順序表的第i(1≤i≤n+1)個元素之前插入一個元素,需向后移動()個元素,刪除第i(1≤i≤n)個元素時,需向前移動()個元素。【解答】n-i+1,n-i

4.在單鏈表中,除了頭結點以外,任一結點的存儲位置由()指示。【解答】其前趨結點的指針域

5.當線性表采用順序存儲結構時,其主要特點是()。【解答】邏輯結構中相鄰的結點在存儲結構中仍相鄰 6.在雙鏈表中,每個結點設置了兩個指針域,其中一個指向()結點,另一個指向()結點。【解答】前驅,后繼

7.設A是一個線性表(a1, a2, …, an),采用順序存儲結構,則在等概率的前提下,平均每插入一個元素需要移動的元素個數為多少?若元素插在ai與ai+1之間(1≤i≤n)的概率為插入一個元素所要移動的元素個數又是多少? 【解答】

,則平均每。

8.線性表存放在整型數組A[arrsize]的前elenum 個單元中,且遞增有序。編寫算法,將元素x插入到線性表的適當位置上,以保持線性表的有序性,并且分析算法的時間復雜度。

【解答】本題是在一個遞增有序表中插入元素x,基本思路是從有序表的尾部開始依次取元素與x比較,若大于x,此元素后移一位,再取它前面一個元素重復上述步驟;否則,找到插入位置,將x插入。具體算法如下:

9.已知單鏈表中各結點的元素值為整型且遞增有序,設計算法刪除鏈表中所有大于mink且小于maxk的所有元素,并釋放被刪結點的存儲空間。

【解答】因為是在有序單鏈表上的操作,所以,要充分利用其有序性。在單鏈表中查找第一個大于mink的結點和第一個小于maxk的結點,再將二者間的所有結點刪除。

10.設單循環鏈表L1,對其遍歷的結果是:x1, x2, x3,…, xn-1, xn。請將該循環鏈表拆成兩個單循環鏈表L1和L2,使得L1中含有原L1表中序號為奇數的結點且遍歷結果為:x1, x3,… ;L2中含有原L1表中序號為偶數的結點且遍歷結果為:… , x4, x2。【解答】算法如下:

第 3 章 特殊線性表——棧、隊列和串

課后習題講解

1.填空

⑴ 設有一個空棧,棧頂指針為1000H,現有輸入序列為1、2、3、4、5,經過push,push,pop,push,pop,push,push后,輸出序列是(),棧頂指針為()。【解答】23,1003H ⑵ 棧通常采用的兩種存儲結構是();其判定棧空的條件分別是(),判定棧滿的條件分別是()。【解答】順序存儲結構和鏈接存儲結構(或順序棧和鏈棧),棧頂指針top=-1和top=NULL,棧頂指針top等于數組的長度和內存無可用空間

⑶()可作為實現遞歸函數調用的一種數據結構。【解答】棧

【分析】遞歸函數的調用和返回正好符合后進先出性。⑷ 表達式a*(b+c)-d的后綴表達式是()。【解答】abc+*d-【分析】將中綴表達式變為后綴表達式有一個技巧:將操作數依次寫下來,再將算符插在它的兩個操作數的后面。

⑸ 棧和隊列是兩種特殊的線性表,棧的操作特性是(),隊列的操作特性是(),棧和隊列的主要區別在于()。

【解答】后進先出,先進先出,對插入和刪除操作限定的位置不同 ⑹ 循環隊列的引入是為了克服()。【解答】假溢出

⑺ 數組Q[n]用來表示一個循環隊列,front為隊頭元素的前一個位置,rear為隊尾元素的位置,計算隊列中元素個數的公式為()。【解答】(rear-front+n)% n 【分析】也可以是(rear-front)% n,但rear-front的結果可能是負整數,而對一個負整數求模,其結果在不同的編譯器環境下可能會有所不同。

⑻ 用循環鏈表表示的隊列長度為n,若只設頭指針,則出隊和入隊的時間復雜度分別是()和()。【解答】O(1),O(n)【分析】在帶頭指針的循環鏈表中,出隊即是刪除開始結點,這只需修改相應指針;入隊即是在終端結點的后面插入一個結點,這需要從頭指針開始查找終端結點的地址。⑼ 串是一種特殊的線性表,其特殊性體現在()。【解答】數據元素的類型是一個字符 ⑽ 兩個串相等的充分必要條件是()。【解答】長度相同且對應位置的字符相等 【分析】例如“abc”≠“abc ”,“abc”≠“bca”。2.選擇題

⑴ 若一個棧的輸入序列是1,2,3,…,n,輸出序列的第一個元素是n,則第i個輸出元素是()。A 不確定 B n-i C n-i-1 D n-i+1 【解答】D 【分析】此時,輸出序列一定是輸入序列的逆序。

⑵ 設棧S和隊列Q的初始狀態為空,元素e1、e2、e3、e4、e5、e6依次通過棧S,一個元素出棧后即進入隊列Q,若6個元素出隊的順序是e2、e4、e3、e6、e5、e1,則棧S的容量至少應該是()。A 6

B C D 2 【解答】C 【分析】由于隊列具有先進先出性,所以,此題中隊列形同虛設,即出棧的順序也是e2、e4、e3、e6、e5、e1。

⑶ 一個棧的入棧序列是1,2,3,4,5,則棧的不可能的輸出序列是()。A 54321 B 45321 C 43512 D 12345 【解答】C 【分析】此題有一個技巧:在輸出序列中任意元素后面不能出現比該元素小并且是升序(指的是元素的序號)的兩個元素。

⑷ 設計一個判別表達式中左右括號是否配對的算法,采用()數據結構最佳 A 順序表 B 棧 C 隊列 D 鏈表 【解答】B 【分析】每個右括號與它前面的最后一個沒有匹配的左括號配對,因此具有后進先出性。

⑸ 在解決計算機主機與打印機之間速度不匹配問題時通常設置一個打印緩沖區,該緩沖區應該是一個()結構。

A 棧 B隊列 C 數組 D線性表 【解答】B 【分析】先進入打印緩沖區的文件先被打印,因此具有先進先出性。⑹ 一個隊列的入隊順序是1,2,3,4,則隊列的輸出順序是()。A 4321 B 1234 C 1432 D 3241 【解答】B 【分析】隊列的入隊順序和出隊順序總是一致的。⑺ 棧和隊列的主要區別在于()。

A 它們的邏輯結構不一樣 B 它們的存儲結構不一樣 C 所包含的運算不一樣 D 插入、刪除運算的限定不一樣 【解答】D 【分析】棧和隊列的邏輯結構都是線性的,都有順序存儲和鏈接存儲,有可能包含的運算不一樣,但不是主要區別,任何數據結構在針對具體問題時包含的運算都可能不同。

⑻ 設數組S[n]作為兩個棧S1和S2的存儲空間,對任何一個棧只有當S[n]全滿時才不能進行進棧操作。為這兩個棧分配空間的最佳方案是()。A S1的棧底位置為0,S2的棧底位置為n-1 B S1的棧底位置為0,S2的棧底位置為n/2 C S1的棧底位置為0,S2的棧底位置為n D S1的棧底位置為0,S2的棧底位置為1 【解答】A 【分析】兩棧共享空間首先兩個棧是相向增長的,棧底應該分別指向兩個棧中的第一個元素的位置,并注意C++中的數組下標是從0開始的。

⑼ 設有兩個串p和q,求q在p中首次出現的位置的運算稱作()。A 連接 B 模式匹配 C 求子串 D 求串長 【解答】B 3.判斷題

⑴ 有n個元素依次進棧,則出棧序列有(n-1)/2種。

【解答】錯。應該有 種。

⑵ 棧可以作為實現過程調用的一種數據結構。

【解答】對。只要操作滿足后進先出性,都可以采用棧作為輔助數據結構。⑶ 在棧滿的情況下不能做進棧操作,否則將產生―上溢‖。【解答】對。

⑷ 在循環隊列中,front指向隊頭元素的前一個位置,rear指向隊尾元素的位置,則隊滿的條件是front=rear。

【解答】錯。這是隊空的判定條件,在循環隊列中要將隊空和隊滿的判定條件區別開。⑸ 空串與空格串是相同的。

【解答】錯。空串的長度為零,而空格串的長度不為0,其長度是串中空格的個數。

4.設有一個棧,元素進棧的次序為A,B,C,D,E,能否得到如下出棧序列,若能,請寫出操作序列,若不能,請說明原因。⑴ C,E,A,B,D ⑵ C,B,A,D,E 【解答】⑴不能,因為在C、E出棧的情況下,A一定在棧中,而且在B的下面,不可能先于B出棧。⑵可以,設I為進棧操作,O為入棧操作,則其操作序列為IIIOOOIOIO。5.舉例說明順序隊列的―假溢出‖現象。

【解答】假設有一個順序隊列,如圖3-6所示,隊尾指針rear=4,隊頭指針front=1,如果再有元素入隊,就會產生―上溢‖,此時的―上溢‖又稱為―假溢出‖,因為隊列并不是真的溢出了,存儲隊列的數組中還有2個存儲單元空閑,其下標分別為0和1。

6.在操作序列push(1)、push(2)、pop、push(5)、push(7)、pop、push(6)之后,棧頂元素和棧底元素分別是什么?(push(k)表示整數k入棧,pop表示棧頂元素出棧。)【解答】棧頂元素為6,棧底元素為1。其執行過程如圖3-7所示。

7. 在操作序列EnQueue(1)、EnQueue(3)、DeQueue、EnQueue(5)、EnQueue(7)、DeQueue、EnQueue(9)之后,隊頭元素和隊尾元素分別是什么?(EnQueue(k)表示整數k入隊,DeQueue表示隊頭元素出隊)。【解答】隊頭元素為5,隊尾元素為9。其執行過程如圖3-8所示。

8.空串和空格串有何區別?串中的空格符有何意義?空串在串處理中有何作用?

【解答】不含任何字符的串稱為空串,其長度為零。僅含空格的串稱為空格串,它的長度為串中空格符的個數。串中的空格符可用來分隔一般的字符,便于人們識別和閱讀,但計算串長時應包括這些空格符。空串在串處理中可作為任意串的子串。9.算法設計

⑴ 假設以不帶頭結點的循環鏈表表示隊列,并且只設一個指針指向隊尾結點,但不設頭指針。試設計相應的入隊和出隊的算法。

【解答】出隊操作是在循環鏈表的頭部進行,相當于刪除開始結點,而入隊操作是在循環鏈表的尾部進行,相當于在終端結點之后插入一個結點。由于循環鏈表不帶頭結點,需要處理空表的特殊情況。入隊算法如下:

出隊算法如下:

⑵ 設順序棧S中有2n個元素,從棧頂到棧底的元素依次為a2n,a2n-1,…,a1,要求通過一個循環隊列重新排列棧中元素,使得從棧頂到棧底的元素依次為a2n,a2n-2,…,a2,a2n-1,a2n-3,…,a1,請設計算法實現該操作,要求空間復雜度和時間復雜度均為O(n)。【解答】操作步驟為: ① 將所有元素出棧并入隊;

② 依次將隊列元素出隊,如果是偶數結點,則再入隊,如果是奇數結點,則入棧; ③ 將奇數結點出棧并入隊; ④ 將偶數結點出隊并入棧; ⑤ 將所有元素出棧并入隊; ⑥ 將所有元素出隊并入棧即為所求。

⑶ 用順序存儲結構存儲串S,編寫算法刪除S中第 i個字符開始的連續j個字符。

【解答】先判斷串S中要刪除的內容是否存在,若存在,則將第i+j-1之后的字符前移j個位置。算法如下:

⑷ 對于采用順序存儲結構的串S,編寫一個函數刪除其值等于ch的所有字符。

【解答】從后向前刪除值為ch的所有元素,這樣所有移動的元素中沒有值為ch的元素,能減少移動元素的次數,提高算法的效率。算法如下:

⑸ 對串的模式匹配KMP算法設計求模式滑動位置的next函數。【解答】參見3.2.5 學習自測及答案

1.在一個具有n個單元的順序棧中,假定以地址低端(即下標為0的單元)作為棧底,以top作為棧頂指針,當出棧時,top的變化為()。A 不變 B top=0;C top=top-1;D top=top+1;【解答】C 2.一個棧的入棧序列是a, b, c, d, e,則棧的不可能的出棧序列是()。A edcba B cdeba C debca D abcde 【解答】C 3.從棧頂指針為top的鏈棧中刪除一個結點,用x保存被刪除結點的值,則執行()。A x=top;top=top->next;B x=top->data;C top=top->next;x=top->data;D x=top->data;top=top->next;【解答】D 4.設元素1, 2, 3, P, A依次經過一個棧,進棧次序為123PA,在棧的輸出序列中,有哪些序列可作為C++程序設計語言的變量名。

【解答】PA321, P3A21, P32A1, P321A, AP321 5.設S=“I_ am_ a_ teacther”,其長度為()。【解答】15 第 4 章 廣義線性表——多維數組和廣義表

課后習題講解

1.填空

⑴ 數組通常只有兩種運算:()和(),這決定了數組通常采用()結構來實現存儲。【解答】存取,修改,順序存儲

【分析】數組是一個具有固定格式和數量的數據集合,在數組上一般不能做插入、刪除元素的操作。除了初始化和銷毀之外,在數組中通常只有存取和修改兩種操作。

⑵ 二維數組A中行下標從10到20,列下標從5到10,按行優先存儲,每個元素占4個存儲單元,A[10][5]的存儲地址是1000,則元素A[15][10]的存儲地址是()。【解答】1140 【分析】數組A中每行共有6個元素,元素A[15][10]的前面共存儲了(15-10)×6+5個元素,每個元素占4個存儲單元,所以,其存儲地址是1000+140=1140。

⑶ 設有一個10階的對稱矩陣A采用壓縮存儲,A[0][0]為第一個元素,其存儲地址為d,每個元素占1個存儲單元,則元素A[8][5]的存儲地址為()。【解答】d+41 【分析】元素A[8][5]的前面共存儲了(1+2+…+8)+5=41個元素。⑷ 稀疏矩陣一般壓縮存儲方法有兩種,分別是()和()。【解答】三元組順序表,十字鏈表

⑸ 廣義表((a),(((b),c)),(d))的長度是(),深度是(),表頭是(),表尾是()。【解答】3,4,(a),((((b),c)),(d))⑹ 已知廣義表LS=(a,(b,c,d),e),用Head和Tail函數取出LS中原子b的運算是()。【解答】Head(Head(Tail(LS)))2.選擇題

⑴ 二維數組A的每個元素是由6個字符組成的串,行下標的范圍從0~8,列下標的范圍是從0~9,則存放A至少需要()個字節,A的第8列和第5行共占()個字節,若A按行優先方式存儲,元素A[8][5]的起始地址與當A按列優先方式存儲時的()元素的起始地址一致。A 90 B 180 C 240 D 540 E 108 F 114 G 54 H A[8][5] I A[3][10] J A[5][8] K A[4][9] 【解答】D,E,K 【分析】數組A為9行10列,共有90個元素,所以,存放A至少需要90×6=540個存儲單元,第8列和第5行共有18個元素(注意行列有一個交叉元素),所以,共占108個字節,元素A[8][5]按行優先存儲的起始地址為d+8×10+5=d+85,設元素A[i][j]按列優先存儲的起始地址與之相同,則d+j×9+i=d+85,解此方程,得i=4,j=9。

⑵ 將數組稱為隨機存取結構是因為()

A 數組元素是隨機的 B 對數組任一元素的存取時間是相等的 C 隨時可以對數組進行訪問 D 數組的存儲結構是不定 【解答】B ⑶ 下面的說法中,不正確的是()

A 數組是一種線性結構 B 數組是一種定長的線性結構

C 除了插入與刪除操作外,數組的基本操作還有存取、修改、檢索和排序等 D 數組的基本操作有存取、修改、檢索和排序等,沒有插入與刪除操 【解答】C 【分析】數組屬于廣義線性表,數組被創建以后,其維數和每維中的元素個數是確定的,所以,數組通常沒有插入和刪除操作。

⑷ 對特殊矩陣采用壓縮存儲的目的主要是為了()A 表達變得簡單 B 對矩陣元素的存取變得簡單 C 去掉矩陣中的多余元素 D 減少不必要的存儲空間 【解答】D 【分析】在特殊矩陣中,有很多值相同的元素并且他們的分布有規律,沒有必要為值相同的元素重復存儲。⑸ 下面()不屬于特殊矩陣。

A 對角矩陣 B 三角矩陣 C 稀疏矩陣 D 對稱矩陣

【解答】C ⑹ 若廣義表A滿足Head(A)=Tail(A),則A為()A()B(())C((),())D((),(),())【解答】B ⑺ 下面的說法中,不正確的是()

A 廣義表是一種多層次的結構 B 廣義表是一種非線性結構 C 廣義表是一種共享結構 D 廣義表是一種遞歸 【解答】B 【分析】從各層元素各自具有的線性關系講,廣義表屬于線性結構。⑻ 下面的說法中,不正確的是()

A 對稱矩陣只須存放包括主對角線元素在內的下(或上)三角的元素即可。B 對角矩陣只須存放非零元素即可。

C 稀疏矩陣中值為零的元素較多,因此可以采用三元組表方法存儲。

D 稀疏矩陣中大量值為零的元素分布有規律,因此可以采用三元組表方法存儲 【解答】D 【分析】稀疏矩陣中大量值為零的元素分布沒有規律,因此采用三元組表存儲。如果零元素的分布有規律,就沒有必要存儲非零元素的行號和列號,而需要按其壓縮規律找出相應的映象函數。3.判斷題

⑴ 數組是一種復雜的數據結構,數組元素之間的關系既不是線性的,也不是樹形的。【解答】錯。例如二維數組可以看成是數據元素為線性表的線性表。⑵ 使用三元組表存儲稀疏矩陣的元素,有時并不能節省存儲空間。

【解答】對。因為三元組表除了存儲非零元素值外,還需要存儲其行號和列號。⑶ 稀疏矩陣壓縮存儲后,必會失去隨機存取功能。

【解答】對。因為壓縮存儲后,非零元素的存儲位置和行號、列號之間失去了確定的關系。

⑷ 線性表可以看成是廣義表的特例,如果廣義表中的每個元素都是單元素,則廣義表便成為線性表。【解答】對。

⑸ 若一個廣義表的表頭為空表,則此廣義表亦為空表。

【解答】錯。如廣義表L=((),(a,b))的表頭為空表,但L不是空表。

4.一個稀疏矩陣如圖4-4所示,寫出對應的三元組順序表和十字鏈表存儲表示。

【解答】對應的三元組順序表如圖4-5所示,十字鏈表如圖4-6所示。

5.已知A為稀疏矩陣,試從空間和時間角度比較采用二維數組和三元組順序表兩種不同的存儲結構完成求 運算的優缺點。

【解答】設稀疏矩陣為m行n列,如果采用二維數組存儲,其空間復雜度為O(m×n);因為要將所有的矩陣元素累加起來,所以,需要用一個兩層的嵌套循環,其時間復雜度亦為O(m×n)。如果采用三元組順序表進行壓縮存儲,假設矩陣中有t個非零元素,其空間復雜度為O(t),將所有的矩陣元素累加起來只需將三元組順序表掃描一遍,其時間復雜度亦為O(t)。當t << m×n時,采用三元組順序表存儲可獲得較好的時、空性能。

6.設某單位職工工資表ST由―工資‖、―扣除‖和―實發金額‖三項組成,其中工資項包括―基本工資‖、―津貼‖和―獎金‖,扣除項包括―水‖、―電‖和―煤氣‖。

⑴ 請用廣義表形式表示所描述的工資表ST,并用表頭和表尾求表中的―獎金‖項; ⑵ 畫出該工資表ST的存儲結構。

【解答】⑴ ST=((基本工資,津貼,獎金),(水,電,煤氣),實發金額)Head(Tail(Tail(Head(ST))))=獎金

⑵ 工資表ST的頭尾表示法如圖4-7所示。

7.若在矩陣A中存在一個元素ai,j(0≤i≤n-1,0≤j≤m-1),該元素是第i行元素中最小值且又是第j列元素中最大值,則稱此元素為該矩陣的一個馬鞍點。假設以二維數組存儲矩陣A,試設計一個求該矩陣所有馬鞍點的算法,并分析最壞情況下的時間復雜度。

【解答】在矩陣中逐行尋找該行中的最小值,然后對其所在的列尋找最大值,如果該列上的最大值與該行上的最小值相等,則說明該元素是鞍點,將它所在行號和列號輸出。

具體算法如下:

分析算法,外層for循環共執行n次,內層第一個for循環執行m次,第二個for循環最壞情況下執行n次,所以,最壞情況下的時間復雜度為O(mn+n2)。

學習自測及答案

1.二維數組M中每個元素的長度是3個字節,行下標從0到7,列下標從0到9,從首地址d開始存儲。若按行優先方式存儲,元素M[7][5]的起始地址為(),若按列優先方式存儲,元素M[7][5]的起始地址為()。【解答】d+22,d+141 2.一個n×n的對稱矩陣,按行優先或列優先進行壓縮存儲,則其存儲容量為()。【解答】n(n+1)/2 3.設n行n列的下三角矩陣A(行列下標均從1開始)已壓縮到一維數組S[1]~S[n(n+1)/2]中,若按行優先存儲,則A[i][j]在數組S中的存儲位置是()。【解答】i×(i-1)/2+j 4.已知廣義表LS=(a,(b, c),(d, e, a)),運用Head函數和Tail函數取出LS中原子d的運算是()。【解答】Head(Head(Tail(Tail(LS))))5.廣義表(a, b,(c,(d)))的表尾是()。A(d)B(c,(d))C b,(c,(d))D(b,(c,(d)))【解答】D 6.設有三對角矩陣An×n(行、列下標均從0開始),將其三條對角線上的元素逐行存于數組B[3n-2]中,使得B[k]=aij求:

⑴ 用i, j表示k的下標變換公式; ⑵ 用k表示i, j的下標變換公式。

【解答】⑴ 要求i, j表示k的下標變換公式,就是要求在k之前已經存儲了多少個非零元素,這些非零元素的個數就是k的值。元素aij求所在的行為i,列為j,則在其前面的非零元素的個數是;k=2 + 3(i-1)+(j-i + 1)= 2i+ j。

⑵ 因為k和i, j之間是一一對應的關系,k+1是當前非零元素的個數,整除即為其所在行號,取余表示當前行中第幾個非零元素,加上前面零元素所在列數就是當前列號,即:

7.已知兩個n×n的對稱矩陣按壓縮存儲方法存儲在已維數組A和B中,編寫算法計算對稱矩陣的乘積。【解答】對稱矩陣采用壓縮存儲,乘積矩陣也采用壓縮存儲。注意矩陣元素的表示方法。

第 5 章 樹和二叉樹

課后習題講解

1.填空題

⑴ 樹是n(n≥0)結點的有限集合,在一棵非空樹中,有()個根結點,其余的結點分成m(m>0)個()的集合,每個集合都是根結點的子樹。【解答】有且僅有一個,互不相交

⑵ 樹中某結點的子樹的個數稱為該結點的(),子樹的根結點稱為該結點的(),該結點稱為其子樹根結點的()。

【解答】度,孩子,雙親

⑶ 一棵二叉樹的第i(i≥1)層最多有()個結點;一棵有n(n>0)個結點的滿二叉樹共有()個葉子結點和()個非終端結點。【解答】2i-1,(n+1)/2,(n-1)/2 【分析】設滿二叉樹中葉子結點的個數為n0,度為2的結點個數為n2,由于滿二叉樹中不存在度為1的結點,所以n=n0+n2;由二叉樹的性質n0=n2+1,得n0=(n+1)/2,n2=(n-1)/2。

⑷ 設高度為h的二叉樹上只有度為0和度為2的結點,該二叉樹的結點數可能達到的最大值是(),最小值是()。【解答】2h-1,2h-1 【分析】最小結點個數的情況是第1層有1個結點,其他層上都只有2個結點。

⑸ 深度為k的二叉樹中,所含葉子的個數最多為()。【解答】2k-1 【分析】在滿二叉樹中葉子結點的個數達到最多。

⑹ 具有100個結點的完全二叉樹的葉子結點數為()。【解答】50 【分析】100個結點的完全二叉樹中最后一個結點的編號為100,其雙親即最后一個分支結點的編號為50,也就是說,從編號51開始均為葉子。

⑺ 已知一棵度為3的樹有2個度為1的結點,3個度為2的結點,4個度為3的結點。則該樹中有()個葉子結點。【解答】12 【分析】根據二叉樹性質3的證明過程,有n0=n2+2n3+1(n0、n2、n3分別為葉子結點、度為2的結點和度為3的結點的個數)。

⑻ 某二叉樹的前序遍歷序列是ABCDEFG,中序遍歷序列是CBDAFGE,則其后序遍歷序列是()。【解答】CDBGFEA 【分析】根據前序遍歷序列和后序遍歷序列將該二叉樹構造出來。

⑼ 在具有n個結點的二叉鏈表中,共有()個指針域,其中()個指針域用于指向其左右孩子,剩下的()個指針域則是空的。【解答】2n,n-1,n+1

⑽ 在有n個葉子的哈夫曼樹中,葉子結點總數為(),分支結點總數為()。【解答】n,n-1 【分析】n-1個分支結點是經過n-1次合并后得到的。

2.選擇題

⑴ 如果結點A有3個兄弟,B是A的雙親,則結點B的度是()。A 1 B 2 C 3 D 4 【解答】D

⑵ 設二叉樹有n個結點,則其深度為()。A n-1 B n C +1 D 不能確定 【解答】D 【分析】此題并沒有指明是完全二叉樹,則其深度最多是n,最少是

+1。

⑶ 二叉樹的前序序列和后序序列正好相反,則該二叉樹一定是()的二叉樹。A 空或只有一個結點 B 高度等于其結點數 C 任一結點無左孩子 D 任一結點無右孩子 【解答】B 【分析】此題注意是序列正好相反,則左斜樹和右斜樹均滿足條件。

⑷ 線索二叉樹中某結點R沒有左孩子的充要條件是()。A R.lchild=NULL B R.ltag=0 C R.ltag=1 D R.rchild=NULL 【解答】C 【分析】線索二叉樹中某結點是否有左孩子,不能通過左指針域是否為空來判斷,而要判斷左標志是否為1。

⑸ 深度為k的完全二叉樹至少有()個結點,至多有()個結點,具有n個結點的完全二叉樹按層序從1開始編號,則編號最小的葉子的序號是()。A 2k-2+1 B 2k-1 C 2k-1 D 2k–1-1 E 2k+1 F 2k+1-1 G 2k-1+1 H 2k 【解答】B,C,A 【分析】深度為k的完全二叉樹最少結點數的情況應是第k層上只有1個結點,最多的情況是滿二叉樹,編號最小的葉子應該是在結點數最少的情況下,葉子結點的編號。

⑹ 一個高度為h的滿二叉樹共有n個結點,其中有m個葉子結點,則有()成立。A n=h+m B h+m=2n C m=h-1 D n=2m-1 【解答】D 【分析】滿二叉樹中沒有度為1的結點,所以有m個葉子結點,則度為2的結點個數為m-1。

⑺ 任何一棵二叉樹的葉子結點在前序、中序、后序遍歷序列中的相對次序()。A 肯定不發生改變 B 肯定發生改變 C 不能確定 D 有時發生變化 【解答】A 【分析】三種遍歷次序均是先左子樹后右子樹。

⑻ 如果T' 是由有序樹T轉換而來的二叉樹,那么T中結點的前序序列就是T' 中結點的()序列,T中結點的后序序列就是 T' 中結點的()序列。A 前序 B 中序 C 后序 D 層序 【解答】A,B

⑼ 設森林中有4棵樹,樹中結點的個數依次為n1、n2、n3、n4,則把森林轉換成二叉樹后,其根結點的右子樹上有()個結點,根結點的左子樹上有()個結點。A n1-1 B n1 C n1+n2+n3 D n2+n3+n4 【解答】D,A 【分析】由森林轉換的二叉樹中,根結點即為第一棵樹的根結點,根結點的左子樹是由第一棵樹中除了根結點以外其余結點組成的,根結點的右子樹是由森林中除第一棵樹外其他樹轉換來的。

⑽ 討論樹、森林和二叉樹的關系,目的是為了()。A 借助二叉樹上的運算方法去實現對樹的一些運算

B 將樹、森林按二叉樹的存儲方式進行存儲并利用二叉樹的算法解決樹的有關問題 C 將樹、森林轉換成二叉樹

D 體現一種技巧,沒有什么實際意義 【解答】B 3.判斷題

⑴ 在線索二叉樹中,任一結點均有指向其前趨和后繼的線索。

【解答】錯。某結點是否有前驅或后繼的線索,取決于該結點的標志域是否為1。

⑵ 在二叉樹的前序遍歷序列中,任意一個結點均處在其子女的前面。【解答】對。由前序遍歷的操作定義可知。

⑶ 二叉樹是度為2的樹。

【解答】錯。二叉樹和樹是兩種不同的樹結構,例如,左斜樹是一棵二叉樹,但它的度為1。

⑷ 由樹轉換成二叉樹,其根結點的右子樹總是空的。【解答】對。因為根結點無兄弟結點。

⑸ 用一維數組存儲二叉樹時,總是以前序遍歷存儲結點。

【解答】錯。二叉樹的順序存儲結構是按層序存儲的,一般適合存儲完全二叉樹。

4.證明:對任一滿二叉樹,其分枝數B=2(n0-1)。(其中,n0為終端結點數)【解答】因為在滿二叉樹中沒有度為1的結點,所以有: n=n0+n2

設B為樹中分枝數,則 n=B+1 所以 B=n0 +n2-1 再由二叉樹性質: n0=n2+1 代入上式有:

B=n0+n0-1-1=2(n0-1)

5.證明:已知一棵二叉樹的前序序列和中序序列,則可唯一確定該二叉樹。【解答】證明采用歸納法。

設二叉樹的前序遍歷序列為a1a2a3… an,中序遍歷序列為b1b2b3… bn。

當n=1時,前序遍歷序列為a1,中序遍歷序列為b1,二叉樹只有一個根結點,所以,a1= b1,可以唯一確定該二叉樹;

假設當n<=k時,前序遍歷序列a1a2a3… ak和中序遍歷序列b1b2b3… bk可唯一確定該二叉樹,下面證明當n=k+1時,前序遍歷序列a1a2a3… akak+1和中序遍歷序列b1b2b3… bk bk+1可唯一確定一棵二叉樹。

在前序遍歷序列中第一個訪問的一定是根結點,即二叉樹的根結點是a1,在中序遍歷序列中查找值為a1的結點,假設為bi,則a1=bi且b1b2… bi-1是對根結點a1的左子樹進行中序遍歷的結果,前序遍歷序列a2a3… ai是對根結點a1的左子樹進行前序遍歷的結果,由歸納假設,前序遍歷序列a2a3… ai和中序遍歷序列b1b2… bi-1唯一確定了根結點的左子樹,同樣可證前序遍歷序列ai+1ai+2… ak+1和中序遍歷序列bi+1bi+2… bk+1唯一確定了根結點的右子樹。

6.已知一棵度為m的樹中有:n1個度為1的結點,n2個度為2的結點,……,nm個度為m的結點,問該樹中共有多少個葉子結點?

【解答】設該樹的總結點數為n,則 n=n0+n1+n2+……+nm 又:

n=分枝數+1=0×n0+1×n1+2×n2+……+m×nm+1 由上述兩式可得:

n0= n2+2n3+……+(m-1)nm+1 7.已知二叉樹的中序和后序序列分別為CBEDAFIGH和CEDBIFHGA,試構造該二叉樹。【解答】二叉樹的構造過程如圖5-12 所示。

8.對給定的一組權值W=(5,2,9,11,8,3,7),試構造相應的哈夫曼樹,并計算它的帶權路徑長度。

【解答】構造的哈夫曼樹如圖5-13所示。

樹的帶權路徑長度為:

WPL=2×4+3×4+5×3+7×3+8×3+9×2+11×2 =120 9.已知某字符串S中共有8種字符,各種字符分別出現2次、1次、4次、5次、7次、3次、4次和9次,對該字符串用[0,1]進行前綴編碼,問該字符串的編碼至少有多少位。

【解答】以各字符出現的次數作為葉子結點的權值構造的哈夫曼編碼樹如圖5-14所示。其帶權路徑長度=2×5+1×5+3×4+5×3+9×2+4×3+4×3+7×2=98,所以,該字符串的編碼長度至少為98位。

10.算法設計 ⑴ 設計算法求二叉樹的結點個數。

【解答】本算法不是要打印每個結點的值,而是求出結點的個數。所以可將遍歷算法中的―訪問‖操作改為―計數操作‖,將結點的數目累加到一個全局變量中,每個結點累加一次即完成了結點個數的求解。具體算法如下:

⑵ 設計算法按前序次序打印二叉樹中的葉子結點。

【解答】本算法的要求與前序遍歷算法既有相同之處,又有不同之處。相同之處是打印次序均為前序,不同之處是此處不是打印每個結點的值,而是打印出其中的葉子結點,即為有條件打印。為此,將前序遍歷算法中的訪問操作改為條件打印即可。算法如下:

⑶ 設計算法求二叉樹的深度。

【解答】當二叉樹為空時,深度為0;若二叉樹不為空,深度應是其左右子樹深度的最大值加1,而其左右子樹深度的求解又可通過遞歸調用本算法來完成。具體算法如下:

⑷ 編寫算法,要求輸出二叉樹后序遍歷序列的逆序。

【解答】要想得到后序的逆序,只要按照后序遍歷相反的順序即可,即先訪問根結點,再遍歷根結點的右子樹,最后遍歷根結點的左子樹。注意和前序遍歷的區別,具體算法如下:

⑸ 以二叉鏈表為存儲結構,編寫算法求二叉樹中結點x的雙親。

【解答】對二叉鏈表進行遍歷,在遍歷的過程中查找結點x并記載其雙親。具體算法如下:

⑹ 以二叉鏈表為存儲結構,在二叉樹中刪除以值x為根結點的子樹。

【解答】對二叉鏈表進行遍歷,在遍歷的過程中查找結點x并記載其雙親,然后將結點x的雙親結點中指向結點x的指針置空。具體算法如下:

⑺ 一棵具有n個結點的二叉樹采用順序存儲結構,編寫算法對該二叉樹進行前序遍歷。【解答】按照題目要求,設置一個工作棧以完成對該樹的非遞歸算法,思路如下:

① 每訪問一個結點,將此結點壓棧,查看此結點是否有左子樹,若有,訪問左子樹,重復執行該過程直到左子樹為空。

② 從棧彈出一個結點,如果此結點有右子樹,訪問右子樹執行步驟①,否則重復執行步驟②。具體算法如下:

⑻ 編寫算法交換二叉樹中所有結點的左右子樹。

【解答】對二叉樹進行后序遍歷,在遍歷過程中訪問某結點時交換該結點的左右子樹。具體算法如下:

⑼ 以孩子兄弟表示法做存儲結構,求樹中結點x的第i個孩子。

【解答】先在鏈表中進行遍歷,在遍歷過程中查找值等于x的結點,然后由此結點的最左孩子域firstchild找到值為x結點的第一個孩子,再沿右兄弟域rightsib找到值為x結點的第i個孩子并返回指向這個孩子的指針。

樹的孩子兄弟表示法中的結點結構定義如下: template struct TNode { T data;TNode *firstchild, *rightsib;};具體算法如下:

學習自測及答案

1.前序遍歷和中序遍歷結果相同的二叉樹是()。A 根結點無左孩子的二叉樹 B 根結點無右孩子的二叉樹

C 所有結點只有左子樹的二叉樹 D 所有結點只有右子樹的二叉樹 【解答】D 1.前序遍歷和中序遍歷結果相同的二叉樹是()。A 根結點無左孩子的二叉樹 B 根結點無右孩子的二叉樹 C 所有結點只有左子樹的二叉樹 D 所有結點只有右子樹的二叉樹【解答】D

2.由權值為{3, 8, 6, 2, 5}的葉子結點生成一棵哈夫曼樹,其帶權路徑長度為()。A 24 B 48 C 53 D 72 【解答】C

3.用順序存儲的方法將完全二叉樹中的所有結點逐層存放在數組A[1] ~ A[n]中,結點A[i]若有左子樹,則左子樹的根結點是()。

A A[2i-1] B A[2i+1] C A[i/2] D A[2i] 【解答】D

4.對任何一棵二叉樹T,如果其終端結點的個數為n0,度為2的結點個數為n2,則()。A n0=n2-1 B n0=n2 C n0=n2+1 D 沒有規律 【解答】C

5.一棵滿二叉樹中共有n個結點,其中有m個葉子結點,深度為h,則()。A n=h+m B h+m=2n C m=h-1 D n=2h-1 【解答】D

6.對于完全二叉樹中的任一結點,若其右分支下的子孫的最大層次為h,則其左分支下的子孫的最大層次為()。

A h B h+1 C h或h+1 D 任意 【解答】C

7.假定一棵度為3的樹中結點數為50,則其最小高度應為。A 3 B 4 C 5 D 6 【解答】C

8.在線索二叉樹中,一個結點是葉子結點的充要條件為()。A 左線索標志為0,右線索標志為1 B 左線索標志為1,右線索標志為0 C 左、右線索標志均為0 D 左、右線索標志均為1 【解答】C

9.對于一棵具有n個結點的樹,其所有結點的度之和為()。【解答】n-1

10.在順序存儲的二叉樹中,編號為i和j的兩個結點處在同一層的條件是()。【解答】

11.現有按前序遍歷二叉樹的結果ABC,問有哪幾種不同的二叉樹可以得到這一結果? 【解答】共有5種二叉樹可以得到這一結果,如圖5-15所示。

12.試找出分別滿足下列條件的所有二叉樹: ⑴ 前序序列和中序序列相同。⑵ 中序序列和后序序列相同。⑶ 前序序列和后序序列相同。

【解答】 ⑴ 空二叉樹、只有一個根結點的二叉樹和右斜樹。⑵ 空二叉樹、只有一個根結點的二叉樹和左斜樹。⑶ 空二叉樹、只有一個根結點的二叉樹

13.將下面圖5-16所示的樹轉換為二叉樹,圖5-17所示的二叉樹轉換為樹或森林。

【解答】圖5-16所示樹轉換的二叉樹如圖5-18所示,圖5-17所示二叉樹轉換的森林如圖5-19所示。

14.以孩子兄弟表示法作為存儲結構,編寫算法求樹的深度。

【解答】采用遞歸算法實現。若樹為空樹,則其深度為0,否則其深度等于第一棵子樹的深度+1和兄弟子樹的深度中的較大者。具體算法如下:

15.設計算法,判斷一棵二叉樹是否為完全二叉樹。

【解答】根據完全二叉樹的定義可知,對完全二叉樹按照從上到下、從左到右的次序(即層序)遍歷應該滿足: ⑴ 若某結點沒有左孩子,則其一定沒有右孩子; ⑵ 若某結點無右孩子,則其所有后繼結點一定無孩子。

若有一結點不滿足其中任意一條,則該二叉樹就一定不是完全二叉樹。因此可采用按層次遍歷二叉樹的方法依次對每個結點進行判斷是否滿足上述兩個條件。為此,需設兩個標志變量BJ和CM,其中BJ表示已掃描過的結點是否均有左右孩子,CM存放局部判斷結果及最后的結果。具體算法如下:

第 6 章 圖

課后習題講解

1.填空題

⑴ 設無向圖G中頂點數為n,則圖G至少有()條邊,至多有()條邊;若G為有向圖,則至少有()條邊,至多有()條邊。【解答】0,n(n-1)/2,0,n(n-1)【分析】圖的頂點集合是有窮非空的,而邊集可以是空集;邊數達到最多的圖稱為完全圖,在完全圖中,任意兩個頂點之間都存在邊。

⑵ 任何連通圖的連通分量只有一個,即是()。【解答】其自身 ⑶ 圖的存儲結構主要有兩種,分別是()和()。【解答】鄰接矩陣,鄰接表

【分析】這是最常用的兩種存儲結構,此外,還有十字鏈表、鄰接多重表、邊集數組等。⑷ 已知無向圖G的頂點數為n,邊數為e,其鄰接表表示的空間復雜度為()。【解答】O(n+e)【分析】在無向圖的鄰接表中,頂點表有n個結點,邊表有2e個結點,共有n+2e個結點,其空間復雜度為O(n+2e)=O(n+e)。

⑸ 已知一個有向圖的鄰接矩陣表示,計算第j個頂點的入度的方法是()。【解答】求第j列的所有元素之和

⑹ 有向圖G用鄰接矩陣A[n][n]存儲,其第i行的所有元素之和等于頂點i的()。【解答】出度

⑺ 圖的深度優先遍歷類似于樹的()遍歷,它所用到的數據結構是();圖的廣度優先遍歷類似于樹的()遍歷,它所用到的數據結構是()。【解答】前序,棧,層序,隊列

⑻ 對于含有n個頂點e條邊的連通圖,利用Prim算法求最小生成樹的時間復雜度為(),利用Kruskal算法求最小生成樹的時間復雜度為()。【解答】O(n2),O(elog2e)【分析】Prim算法采用鄰接矩陣做存儲結構,適合于求稠密圖的最小生成樹;Kruskal算法采用邊集數組做存儲結構,適合于求稀疏圖的最小生成樹。

⑼ 如果一個有向圖不存在(),則該圖的全部頂點可以排列成一個拓撲序列。【解答】回路

⑽ 在一個有向圖中,若存在弧、、,則在其拓撲序列中,頂點vi, vj, vk的相對次序為()。【解答】vi, vj, vk 【分析】對由頂點vi, vj, vk組成的圖進行拓撲排序。2.選擇題

⑴ 在一個無向圖中,所有頂點的度數之和等于所有邊數的()倍。A 1/2 B 1 C 2 D 4 【解答】C 【分析】設無向圖中含有n個頂點e條邊,則。

⑵ n個頂點的強連通圖至少有()條邊,其形狀是()。A n B n+1 C n-1 D n×(n-1)E 無回路

F 有回路

G 環狀

H 樹狀 【解答】A,G ⑶ 含n 個頂點的連通圖中的任意一條簡單路徑,其長度不可能超過()。A 1 B n/2 C n-1 D n 【解答】C 【分析】若超過n-1,則路徑中必存在重復的頂點。

⑷ 對于一個具有n個頂點的無向圖,若采用鄰接矩陣存儲,則該矩陣的大小是()。A n B(n-1)2 C n-1 D n2 【解答】D ⑸ 圖的生成樹(),n個頂點的生成樹有()條邊。A 唯一

B 不唯一

C 唯一性不能確定 D n E n +1 F n-1 【解答】C,F ⑹ 設無向圖G=(V, E)和G' =(V', E'),如果G' 是G的生成樹,則下面的說法中錯誤的是()。A G' 為 G的子圖 B G' 為 G的連通分量

C G' 為G的極小連通子圖且V = V' D G' 是G的一個無環子圖 【解答】B 【分析】連通分量是無向圖的極大連通子圖,其中極大的含義是將依附于連通分量中頂點的所有邊都加上,所以,連通分量中可能存在回路。

⑺ G是一個非連通無向圖,共有28條邊,則該圖至少有()個頂點。A 6 B 7 C 8 D 9 【解答】D 【分析】n個頂點的無向圖中,邊數e≤n(n-1)/2,將e=28代入,有n≥8,現已知無向圖非連通,則n=9。⑻ 最小生成樹指的是()。A 由連通網所得到的邊數最少的生成樹 B 由連通網所得到的頂點數相對較少的生成樹 C 連通網中所有生成樹中權值之和為最小的生成樹 D 連通網的極小連通子圖

⑼ 判定一個有向圖是否存在回路除了可以利用拓撲排序方法外,還可以用()。A 求關鍵路徑的方法

B 求最短路徑的方法 C 廣度優先遍歷算法

D 深度優先遍歷算法 【解答】D 【分析】當有向圖中無回路時,從某頂點出發進行深度優先遍歷時,出棧的順序(退出DFSTraverse算法)即為逆向的拓撲序列。

⑽ 下面關于工程計劃的AOE網的敘述中,不正確的是()?br /> A 關鍵活動不按期完成就會影響整個工程的完成時間

B 任何一個關鍵活動提前完成,那么整個工程將會提前完成 C 所有的關鍵活動都提前完成,那么整個工程將會提前完成 D 某些關鍵活動若提前完成,那么整個工程將會提前完 【解答】B 【分析】AOE網中的關鍵路徑可能不止一條,如果某一個關鍵活動提前完成,還不能提前整個工程,而必須同時提高在幾條關鍵路徑上的關鍵活動。3.判斷題

⑴ 一個有向圖的鄰接表和逆鄰接表中的結點個數一定相等。

【解答】對。鄰接表和逆鄰接表的區別僅在于出邊和入邊,邊表中的結點個數都等于有向圖中邊的個數。⑵ 用鄰接矩陣存儲圖,所占用的存儲空間大小只與圖中頂點個數有關,而與圖的邊數無關。【解答】對。鄰接矩陣的空間復雜度為O(n2),與邊的個數無關。⑶ 圖G的生成樹是該圖的一個極小連通子圖 【解答】錯。必須包含全部頂點。

⑷ 無向圖的鄰接矩陣一定是對稱的,有向圖的鄰接矩陣一定是不對稱的

【解答】錯。有向圖的鄰接矩陣不一定對稱,例如有向完全圖的鄰接矩陣就是對稱的。⑸ 對任意一個圖,從某頂點出發進行一次深度優先或廣度優先遍歷,可訪問圖的所有頂點。【解答】錯。只有連通圖從某頂點出發進行一次遍歷,可訪問圖的所有頂點。⑹ 在一個有向圖的拓撲序列中,若頂點a在頂點b之前,則圖中必有一條弧。【解答】錯。只能說明從頂點a到頂點b有一條路徑。

⑺ 若一個有向圖的鄰接矩陣中對角線以下元素均為零,則該圖的拓撲序列必定存在。【解答】對。參見第11題的證明。

⑻ 在AOE網中一定只有一條關鍵路徑?br />【解答】錯。AOE網中可能有不止一條關鍵路徑,他們的路徑長度相同。

4.n個頂點的無向圖,采用鄰接表存儲,回答下列問題?br />⑴ 圖中有多少條邊? ⑵ 任意兩個頂點i和j是否有邊相連? ⑶ 任意一個頂點的度是多少?br />【解答】 ⑴ 邊表中的結點個數之和除以2。⑵ 第i個邊表中是否含有結點j。⑶ 該頂點所對應的邊表中所含結點個數。

5.n個頂點的無向圖,采用鄰接矩陣存儲,回答下列問題: ⑴ 圖中有多少條邊?

⑵ 任意兩個頂點i和j是否有邊相連? ⑶ 任意一個頂點的度是多少? 【解答】

⑴ 鄰接矩陣中非零元素個數的總和除以2。

⑵ 當鄰接矩陣A中A[i][j]=1(或A[j][i]=1)時,表示兩頂點之間有邊相連。⑶ 計算鄰接矩陣上該頂點對應的行上非零元素的個數。6.證明:生成樹中最長路徑的起點和終點的度均為1。【解答】用反證法證明。

設v1, v2, …, vk是生成樹的一條最長路徑,其中,v1為起點,vk為終點。若vk的度為2,取vk的另一個鄰接點v,由于生成樹中無回路,所以,v在最長路徑上,顯然v1, v2, …, vk , v的路徑最長,與假設矛盾。所以生成樹中最長路徑的終點的度為1。同理可證起點v1的度不能大于1,只能為1。

7.已知一個連通圖如圖6-6所示,試給出圖的鄰接矩陣和鄰接表存儲示意圖,若從頂點v1出發對該圖進行遍歷,分別給出一個按深度優先遍歷和廣度優先遍歷的頂點序列。

【解答】鄰接矩陣表示如下:

深度優先遍歷序列為:v1 v2 v3 v5 v4 v6 廣度優先遍歷序列為:v1 v2 v4 v6 v3 v5 鄰接表表示如下:

8.圖6-7所示是一個無向帶權圖,請分別按Prim算法和Kruskal算法求最小生成樹。

【解答】按Prim算法求最小生成樹的過程如下:

按Kruskal算法求最小生成樹的過程如下:

9.對于圖6-8所示的帶權有向圖,求從源點v1到其他各頂點的最短路徑。

【解答】從源點v1到其他各頂點的最短路徑如下表所示。源點 終點 最短路徑 最短路徑長度 v1 v7 v1 v7 7 v1 v5 v1 v5 11 v1 v4 v1 v7 v4 13 v1 v6 v1 v7 v4 v6 16 v1 v2 v1 v7 v2 22 v1 v3 v1 v7 v4 v6 v3 25 10.如圖6-9所示的有向網圖,利用Dijkstra算法求從頂點v1到其他各頂點的最短路徑。

【解答】從源點v1到其他各頂點的最短路徑如下表所示。源點 終點 最短路徑 最短路徑長度 v1 v3 v1 v3 15 v1 v5 v1 v5 15 v1 v2 v1 v3 v2 25 v1 v6 v1 v3 v2 v6 40 v1 v4 v1 v3 v2 v4 45 11.證明:只要適當地排列頂點的次序,就能使有向無環圖的鄰接矩陣中主對角線以下的元素全部為0。【解答】任意n個結點的有向無環圖都可以得到一個拓撲序列。設拓撲序列為v0v1v2…vn-1,我們來證明此時的鄰接矩陣A為上三角矩陣。證明采用反證法。

假設此時的鄰接矩陣不是上三角矩陣,那么,存在下標i和j(i>j),使得A[i][j]不等于零,即圖中存在從vi到vj的一條有向邊。由拓撲序列的定義可知,在任意拓撲序列中,vi的位置一定在vj之前,而在上述拓撲序列v0v1v2…vn-1中,由于i>j,即vi的位置在vj之后,導致矛盾。因此命題正確。12.算法設計

⑴ 設計算法,將一個無向圖的鄰接矩陣轉換為鄰接表。

【解答】先設置一個空的鄰接表,然后在鄰接矩陣上查找值不為零的元素,找到后在鄰接表的對應單鏈表中插入相應的邊表結點。鄰接矩陣存儲結構定義如下: const int MaxSize=10;template struct AdjMatrix {

T vertex[MaxSize];//存放圖中頂點的數組 int arc[MaxSize][MaxSize];//存放圖中邊的數組 int vertexNum, arcNum;//圖的頂點數和邊數 };鄰接表存儲結構定義如下: const int MaxSize=10;struct ArcNode //定義邊表結點 { int adjvex;//鄰接點域 ArcNode *next;};template

struct VertexNode //定義頂點表結點 { T vertex;ArcNode *firstedge;};struct AdjList { VertexNode adjlist[MaxSize];int vertexNum, arcNum;//圖的頂點數和邊數 };具體算法如下:

第三篇:數據結構課后習題答案總結

第一章

第1章作業:1.1,1.2,1.6(1)(3)1.8 1.1 簡述下列概念:數據、數據元素、數據類型、數據結構、邏輯結構、存儲結構、線性結構、非線性結構。● 數據:指能夠被計算機識別、存儲和加工處理的信息載體。

● 數據元素:就是數據的基本單位,在某些情況下,數據元素也稱為元素、結點、頂點、記錄。數據元素有時可以由若干數據項組成。

● 數據類型:是一個值的集合以及在這些值上定義的一組操作的總稱。通常數據類型可以看作是程序設計語言中已實現的數據結構。

● 數據結構:指的是數據之間的相互關系,即數據的組織形式。一般包括三個方面的內容:數據的邏輯結構、存儲結構和數據的運算。

● 邏輯結構:指數據元素之間的邏輯關系。

● 存儲結構:數據元素及其關系在計算機存儲器內的表示,稱為數據的存儲結構.● 線性結構:數據邏輯結構中的一類。它的特征是若結構為非空集,則該結構有且只有一個開始結點和一個終端結點,并且所有結點都有且只有一個直接前趨和一個直接后繼。線性表就是一個典型的線性結構。棧、隊列、串等都是線性結構。● 非線性結構:數據邏輯結構中的另一大類,它的邏輯特征是一個結點可能有多個直接前趨和直接后繼。數組、廣義表、樹和圖等數據結構都是非線性結構。

1.2 試舉一個數據結構的例子、敘述其邏輯結構、存儲結構、運算三個方面的內容。

答:例如有一張學生體檢情況登記表,記錄了一個班的學生的身高、體重等各項體檢信息。這張登記表中,每個學生的各項體檢信息排在一行上。這個表就是一個數據結構。每個記錄(有姓名,學號,身高和體重等字段)就是一個結點,對于整個表來說,只有一個開始結點(它的前面無記錄)和一個終端結點(它的后面無記錄),其他的結點則各有一個也只有一個直接前趨和直接后繼(它的前面和后面均有且只有一個記錄)。這幾個關系就確定了這個表的邏輯結構是線性結構。

這個表中的數據如何存儲到計算機里,并且如何表示數據元素之間的關系呢? 即用一片連續的內存單元來存放這些記錄(如用數組表示)還是隨機存放各結點數據再用指針進行鏈接呢? 這就是存儲結構的問題。

在這個表的某種存儲結構基礎上,可實現對這張表中的記錄進行查詢,修改,刪除等操作。對這個表可以進行哪些操作以及如何實現這些操作就是數據的運算問題了。

1.6 設n為正整數,利用大“O”記號,將下列程序段的執行時間表示為n的函數。

(1)i=1;k=0;while(ij)j++;else i++;} 分析:

通過分析以上程序段,可將i+j看成一個控制循環次數的變量,且每執行一次循環,i+j的值加1。該程序段的主要時間消耗是while循環,而while循環共做了n次,所以該程序段的執行時間為:

T(n)=O(n)

1.8 按增長率由小至大的順序排列下列各函數:2100,(3/2)n,(2/3)n,nn ,n0.5 , n!,2n,lgn ,nlgn, n(3/2)

答:常見的時間復雜度按數量級遞增排列,依次為:常數階0(1)、對數階0(log2n)、線性階0(n)、線性對數階0(nlog2n)、平方階0(n2)、立方階0(n3)、k次方階0(nk)、指數階0(2n)。先將題中的函數分成如下幾類:

常數階:2 對數階:lgn K次方階:n、n0.5(3/2)100

指數階(按指數由小到大排):nlgn、(3/2)n、2n、n!、nn

注意:(2/3)^n由于底數小于1,所以是一個遞減函數,其數量級應小于常數階。

根據以上分析按增長率由小至大的順序可排列如下:(2/3)n < 2100 < lgn < n0.5 < n(3/2)< nlgn <(3/2)n < 2n < n!< nn

第二章

第二章作業:2.2,2.6,2.9,2.13 2.2 何時選用順序表、何時選用鏈表作為線性表的存儲結構為宜? 答:在實際應用中,應根據具體問題的要求和性質來選擇順序表或鏈表作為線性表的存儲結構,通常有以下幾方面的考慮: 1.基于空間的考慮。當要求存儲的線性表長度變化不大,易于事先確定其大小時,為了節約存儲空間,宜采用順序表;反之,當線性表長度變化大,難以估計其存儲規模時,采用動態鏈表作為存儲結構為好。

2.基于時間的考慮。若線性表的操作主要是進行查找,很少做插入和刪除操作時,采用順序表做存儲結構為宜;反之,若需要對線性表進行頻繁地插入或刪除等的操作時,宜采用鏈表做存儲結構。并且,若鏈表的插入和刪除主要發生在表的首尾兩端,則采用尾指針表示的單循環鏈表為宜。2.6 下述算法的功能是什么? LinkList Demo(LinkList L){ // L 是無頭結點單鏈表 ListNode *Q,*P;if(L&&L->next){ Q=L;L=L->next;P=L;while(P->next)P=P->next;P->next=Q;Q->next=NULL;} return L;}// Demo 答:該算法的功能是:將開始結點摘下鏈接到終端結點之后成為新的終端結點,而原來的第二個結點成為新的開始結點,返回新鏈表的頭指針。

2.7 設線性表的n個結點定義為(a0,a1,...an-1),重寫順序表上實現的插入和刪除算法:InsertList 和DeleteList.解:算法如下: #define ListSize 100 // 假定表空間大小為100 typedef int DataType;//假定DataType的類型為int型 typedef struct{ DataType data[ListSize];// 向量data用于存放表結點 int length;// 當前的表長度 } Seqlist;//以上為定義表結構

void InsertList(Seqlist *L, Datatype x, int i){ //將新結點x插入L所指的順序表的第i個結點ai的位置上,即插入的合法位置為:0<=i<=L->length int j;if(i < 0 || i > L-> length)Error(“position error”);// 非法位置,退出,if(L->length>=ListSize)Error(“overflow“);

for(j=L->length-1;j >= i;j--)L->data[ j+1]=L->data [ j ];L->data[ i ]=x;L->length++;} 2.9 設順序表L是一個遞增有序表,試寫一算法,將x插入L中,并使L仍是一個有序表。

答:因已知順序表L是遞增有序表,所以只要從順序表終端結點(設為i位置元素)開始向前尋找到第一個小于或等于x的元素位置i后插入該位置即可。在尋找過程中,由于大于x的元素都應放在x之后,所以可邊尋找,邊后移元素,當找到第一個小于或等于x的元素位置i時,該位置也空出來了。

算法如下:

//順序表存儲結構如題2.7 void InsertIncreaseList(Seqlist *L , Datatype x){ int i;if(L->length>=ListSize)Error(“overflow”);

for(i=L-> length;i>0 && L->data[ i-1 ] > x;i--)L->data[ i ]=L->data[ i ];// 比較并移動元素 L->data[ i ] =x;L-> length++;} 2.13 設 A和B是兩個單鏈表,其表中元素遞增有序。試寫一算法將A和B歸并成一個按元素值遞減有序的單鏈表C,并要求輔助空間為O(1),請分析算法的時間復雜度。

解:根據已知條件,A和B是兩個遞增有序表,所以可以先取A表的表頭建立空的C表。然后同時掃描A表和B表,將兩表中最大的結點從對應表中摘下,并作為開始結點插入C表中。如此反復,直到A表或B表為空。最后將不為空的A表或B表中的結點依次摘下并作為開始結點插入C表中。這時,得到的C表就是由A表和B表歸并成的一個按元素值遞減有序的單鏈表C。并且輔助空間為O(1)。

算法如下:

LinkList MergeSort(LinkList A , LinkList B){// 歸并兩個帶頭結點的遞增有序表為一個帶頭結點遞減有序表 ListNode *pa , *pb , *q , *C;pa=A->next;//pa指向A表開始結點

C=A;C->next=NULL;//取A表的表頭建立空的C表 pb=B->next;//pb指向B表開始結點 free(B);//回收B表的頭結點空間 while(pa && pb){ if(pb->data <= pa->data){ // 當B中的元素小于等于A中當前元素時,將pa表的開始結點摘下 q=pa;pa=pa->next;} else {// 當B中的元素大于A中當前元素時,將pb表的開始結點摘下 q=pb;pb=pb->next;} q->next=C->next;C->next=q;//將摘下的結點q作為開始結點插入C表 } //若pa表非空,則處理pa表 while(pa){ q=pa;pa=pa->next;q->next=C->next;C->next=q;} //若pb表非空,則處理pb表 while(pb){ q=pb;pa=pb->next;q->next=C->next;C->next=q;} return(C);} 該算法的時間復雜度分析如下:

算法中有三個while 循環,其中第二個和第三個循環只執行一個。每個循環做的工作都是對鏈表中結點掃描處理。整個算法完成后,A表和B表中的每個結點都被處理了一遍。所以若A表和B表的表長分別是m和n,則該算法的時間復雜度O(m+n)

●練習2.1:寫出在線性表中的查找運算算法。

即查找數據元素x在表中的位置,也就是數據元素下標值加1。

例如:若L.data[i]=x,則返回i+1;若不存在,則返回n+1 練習2.2:編寫尾插法建立鏈表的算法。

練習2.3:若是帶頭指針的單鏈表,算法又是怎樣?

若是兩個鏈表,既知道頭結點,又知道尾結點,算法又是怎樣?

●練習2:按升序打印帶頭結點h的單鏈表中各節點的數據域值,并將打印完的節點從表中刪除。

第三章

第三章作業:3.2, 3.3,3.4(2),3.6,3.11 3.2 循環隊列的優點是什么? 如何判別它的空和滿? 答:循環隊列的優點是:它可以克服順序隊列的“假上溢”現象,能夠使存儲隊列的向量空間得到充分的利用。判別循環隊列的“空”或“滿”不能以頭尾指針是否相等來確定,一般是通過以下幾種方法:一是另設一布爾變量來區別隊列的空和滿。二是少用一個元素的空間,每次入隊前測試入隊后頭尾指針是否會重合,如果會重合就認為隊列已滿。三是設置一計數器記錄隊列中元素總數,不僅可判別空或滿,還可以得到隊列中元素的個數。

3.3設長度為n的鏈隊用單循環鏈表表示,若設頭指針,則入隊出隊操作的時間為何? 若只設尾指針呢? 答:當只設頭指針時,出隊的時間為1,而入隊的時間需要n,因為每次入隊均需從頭指針開始查找,找到最后一個元素時方可進行入隊操作。若只設尾指針,則出入隊時間均為1。因為是循環鏈表,尾指針所指的下一個元素就是頭指針所指元素,所以出隊時不需要遍歷整個隊列。3.4 指出下述程序段的功能是什么?(2)SeqStack S1, S2, tmp;

DataType x;

...//假設棧tmp和S2已做過初始化

while(!StackEmpty(&S1))

{

x=Pop(&S1);

Push(&tmp,x);

}

while(!StackEmpty(&tmp))

{

x=Pop(&tmp);

Push(&S1,x);

Push(&S2, x);

}(2)程序段的功能是利用tmp棧將一個非空棧s1的所有元素按原樣復制到一個棧s2當中去。

3.6 利用棧的基本操作,寫一個將棧S中所有結點均刪去的算法void ClearStack(SeqStack *S),并說明S為何要作為指針參數

解:算法如下

void ClearStack(SeqStack *S)

{ // 刪除棧中所有結點

S->Top =-1;//其實只是將棧置空

}

因為要置空的是棧S,如果不用指針來做參數傳遞,那么函數進行的操作不能對原來的棧產生影響,系統將會在內存中開辟另外的單元來對形參進行函數操作。結果等于什么也沒有做。所以想要把函數操作的結果返回給實參的話,就只能用指針來做參數傳遞了。

3.8 設計算法判斷一個算術表達式的圓括號是否正確配對。(提示: 對表達式進行掃描,凡遇到‘(’就進棧,遇‘)’就退掉棧頂的‘(’,表達式被掃描完畢,棧應為空。解:

根據提示,可以設計算法如下:

int PairBracket(char *SR)

{//檢查表達式SR中括號是否配對

int i;

SeqStack S;//定義一個棧

InitStack(&s);

for(i=0;i

{

if(SR[i]==‘(’)Push(&S, SR[i]);//遇‘(’時進棧

if(SR[i]==‘)’)//遇‘)’

if(!StackEmpty(S))//棧不為空時,將棧頂元素出棧

Pop(&s);

else return 0;//不匹配,返回0

}

if(EmptyStack(&s))return 1;// 匹配,返回1

else return 0;//不匹配,返回0

} 6.12 若二叉樹中各結點的值均不相同,則由二叉樹的前序序列和中序序列,或由其后序序列和中序序列均能唯一地確定一棵二叉樹,但由前序序列和后序序列卻不一定能唯一地確定一棵二叉樹。

(1)已知一棵二叉樹的前序序列和中序序列分別為ABDGHCEFI和GDHBAECIF,請畫出此二叉樹。(2)已知一棵二叉樹的中序序列和后序序列分別為BDCEAFHG和DECBHGFA,請畫出此二叉樹。(3)已知一棵二叉樹的前序序列和后序序列分別為AB和BA,請畫出這兩棵不同的二叉樹。解:

(1)已知二叉樹的前序序列為ABDGHCEFI和中序序列GDHBAECIF,則可以根據前序序列找到根結點為A,由此,通過中序序列可知它的兩棵子樹包分別含有GDHB和ECIF結點,又由前序序列可知B和C分別為兩棵子樹的根結點...以此類推可畫出所有結點:

○A / ○B ○C / / ○D ○E○F / / ○G ○H ○I

(2)以同樣的方法可畫出該二叉樹:

○A / ○B ○F ○C ○G / ○D ○E ○H

(3)這兩棵不同的二叉樹為:

○A ○A / ○B ○B 6.21 以二叉鏈表為存儲結構,寫一算法交換各結點的左右子樹。

答:要交換各結點的左右子樹,最方便的辦法是用后序遍歷算法,每訪問一個結點時把兩棵子樹的指針進行交換,最后一次訪問是交換根結點的子樹。

void ChangeBinTree(BinTree *T)

{ //交換子樹

if(*T)

{ //這里以指針為參數使得交換在實參的結點上進行后序遍歷

BinTree temp;

ChangeBinTree(&(*T)->lchild);

ChangeBinTree(&(*T)->rchild);

temp=(*T)->lchild;

(*T)->lchild=(*T)->rchild;

(*T)->rchild=temp;

}

} 9.11試寫出二分查找的遞歸算法。解:

int BinSearch(SeqList R,KeyType K,int low,int high)

{ //在有序表R[low..high]中進行二分查找,成功時返回結點的位置,失敗時返回零

int mid; //置當前查找區間上、下界的初值

if(low<=high){ //當前查找區間R[low..high]非空

mid=(low+high)/2;

if(R[mid].key==K)return mid; //查找成功返回

if(R[mid].key>K)

return BinSearch(R,K,low,mid-1)//在R[low..mid-1]中查找

else

return BinSearch(R,K,mid+1,high); //在R[mid+1..high]中查找

}

return 0; //當low>high時表示查找區間為空,查找失敗

} //BinSeareh 10.7.將哨兵放在R[n]中,被排序的記錄放在R[0..n-1]中,重寫直接插入排序算法。解:

重寫的算法如下:

void InsertSort(SeqList R)

{//對順序表中記錄R[0..n-1]按遞增序進行插入排序

int i,j;

for(i=n-2;i>=0;i--)//在有序區中依次插入R[n-2]..R[0]

if(R[i].key>R[i+1].key)//若不是這樣則R[i]原位不動

{

R[n]=R[i];j=i+1;//R[n]是哨兵

do{ //從左向右在有序區中查找插入位置

R[j-1]=R[j];//將關鍵字小于R[i].key的記錄向右移

j++;

}while(R[j].key

R[j-1]=R[n];//將R[i]插入到正確位置上

}//endif

}//InsertSort.12.1 常見的文件組織方式有哪幾種?各有何特點? 文件上的操作有哪幾種? 如何評價文件組織的效率? 答:

常用的文件組織方式有:順序文件、索引文件、散列文件和多關鍵字文件。

●順序文件的特點是,它是按記錄進入文件的先后順序存放,其邏輯結構和物理順序是一致的。

●索引文件的特點是,在主文件之外還另外建立了一張表,由這張表來指明邏輯記錄和物理記錄之間的一一對應關系。索引文件在存儲器上分為兩個區:索引區和數據區,前者存放索引表,后者存放主文件。●散列文件是利用散列存儲方式組織的,它類似于散列表,即根據文件中關鍵字的特點,設計一個散列函數和處理沖突的方法,將記錄散列到存儲設備上,對于散列文件,磁盤上的文件記錄通常是成組存放的。

●多關鍵字文件則包含有多個次關鍵索引的,不同于前述幾種文件,只含有一個主關鍵字。

文件的操作有兩種:檢索和維護。

評價一個文件組織的效率,是執行文件操作(如查找、刪除等)所花費的時間和文件組織所需的存儲空間。

第四篇:數據結構查找習題及答案

第9章查找

一、單選題

1.對一棵二叉搜索樹按()遍歷,可得到結點值從小到大的排列序列。

A.先序 B.中序

C.后序

D.層次

2.從具有n個結點的二叉搜索樹中查找一個元素時,在平均情況下的時間復雜度大致為()。

A.O(n)

B.O(1)

C.O(logn)

D.O(n2)3.從具有n個結點的二叉搜索樹中查找一個元素時,在最壞情況下的時間復雜度為()。

A.O(n)

B.O(1)

C.O(logn)

D.O(n2)4.在二叉搜索樹中插入一個結點的時間復雜度為()。

A.O(1)B.O(n)

C.O(logn)

D.O(n2)5.分別以下列序列構造二叉搜索樹,與用其它三個序列所構造的結果不同的是()。

A.(100,80,90,60,120,110,130)B.(100,120,110,130,80,60,90)C.(100,60,80,90,120,110,130)D.(100,80,60,90,120,130,110)

6.在一棵AVL樹中,每個結點的平衡因子的取值范圍是()。

A.-1?1 B.-2?2 C.1?2

D.0?1 7.根據一組關鍵字(56,42,50,64,48)依次插入結點生成一棵AVL樹,當插入到值為()的結點時需要進行旋轉調整。A.42 B.50

C.64

D.48 8.深度為4的AVL樹至少有()個結點。

A.9 B.8

C.7

D.6 9.一棵深度為k的AVL樹,其每個分支結點的平衡因子均為0,則該平衡二叉樹共有()個結點。A.2k-1-1 B.2k-1+1

C.2k-1

D.2k

10.在AVL樹中插入一個結點后造成了不平衡,設最低的不平衡結點為A,并已知A的左孩子的平衡因子為0,右孩子的平衡因子為1,則應作()型調整以使其平衡。A.LL

B.LR

C.RL

D.RR

二、判斷題 1.二叉搜索樹的任意一棵子樹中,關鍵字最小的結點必無左孩子,關鍵字最大的結點必無右孩子。

2.二叉搜索樹中每個結點的關鍵字值大于其左非空子樹(若存在的話)所有結點的關鍵字值,且小于其右非空子樹(若存在的話)所有結點的關鍵字值。

3.二叉搜索樹按照中序遍歷將各結點打印出將各結點打印出來,將得到按照由小到大的排列。

4.若二叉搜索樹的根結點沒有左兒子,則根結點一定是值最小的結點。5.二叉搜索樹一定是滿二叉樹。

6.從二叉搜索樹的根結點一直沿右兒子向下找不一定能找到樹中值最大的結點。7.二叉搜索樹的充要條件是任一結點的值均大于其左孩子的值,小于其右孩子的值。8.若二叉搜索樹中關鍵碼互不相同,則其中最小元素和最大元素一定是葉子結點。9.在任意一棵非空二叉搜索樹中,刪除某結點后又將其插入,則所得二叉搜索樹與原二叉搜索樹相同。

10.當向二叉搜索樹中插入一個結點,則該結點一定成為葉子結點。11.AVL樹是指左右子樹的高度差的絕對值不大于1的二叉樹。12.AVL是一棵二叉樹,其樹上任一結點的平衡因子的絕對值不大于1。

13.在AVL樹中,向某個平衡因子不為零的結點的樹中插入一新結點,必引起平衡旋轉。

三、填空題

1.在一棵二叉搜索樹上實施遍歷后,其關鍵字序列是一個有序表。

2.一個無序序列可以通過構造一棵_______而變成一個有序序列,構造樹的過程即為對無序序列進行排序的過程。

3.在一棵二叉搜索樹中,每個分支結點的左子樹上所有結點的值一定________該結點的值,右子樹上所有結點的值一定________該結點。

4.從一棵二叉搜索樹中查找一個元素時,若元素的值等于根結點的值,則表明_______,若元素的值小于根結點的值,則繼續向_______查找,若元素的值大于根結點的值,則繼續向________查找。

5.向一棵二叉搜索樹中插入一個元素時,若元素的值小于根結點的值,則接著向根結點的________插入,若元素的值大于根結點的值,則接著向根結點的________插入。6.根據n個元素建立一棵二叉搜索樹的時間復雜度大致為________。7.二叉樹中某一結點左子樹的深度減去右子樹的深度稱為該結點的_______。8.深度為4的平衡二叉樹中至少有個結點,至多有個結點。

9.在一棵AVL樹中,每個結點的左子樹高度與右子樹高度之差的絕對值不超過________。

四、應用題

1.一棵二叉搜索樹的結構如下圖所示,結點的值為1~8,請標出各結點的值。

2.若依次輸入序列{62,68,30,61,25,14,53,47,90,84}中的元素,生成一棵二叉搜索樹。畫出生成后的二叉搜索樹(畫出生成過程)。

3.依次讀入給定的整數序列{7,16,4,8,20,9,6,18,5},構造一棵二叉搜索樹,并計算在等概率情況下該二叉搜索樹的平均查找長度ASL。(要求給出構造過程)

4.從空二叉樹開始,嚴格按照二叉搜索樹的插入算法(不進行平衡旋轉),逐個插入關鍵碼{18,73,10,5,68,99,27,41,51,32,25}構造出一棵二叉搜索樹,畫出這棵二叉搜索樹并寫出其前序、后序遍歷序列。

5.若一棵二叉搜索樹的關鍵字輸入序列為{80,6,10,7,8,25,100,90},請畫出該二叉搜索樹。

6.設有一組初始記錄關鍵字為(45,80,48,40,22,78),要求構造一棵二叉搜索樹并給出構造過程。

7.假定一個關鍵字序列為(38,52,25,74,68,16,30,54,90,72),畫出按序列中元素的次序生成的一棵二叉搜索樹,求出其平均查找長度。

8.將數列(24,15,38,27,121,76,130)的各元素依次插入一棵初始為空的二叉搜索樹中,請畫出最后的結果并求等概率情況下查找成功的平均查找長度。

9.輸入一個正整數序列{40,28,6,72,100,3,54,1,80,91,38},建立一棵二叉搜索樹,然后刪除結點72,分別畫出該二叉樹及刪除結點72后的二叉樹。

10.根據元素插入的先后次序不同,可構成多種形態的二叉搜索樹。請畫出4棵含1,2,3,4四個元素且以1為根、深度為3的二叉搜索樹。11.請畫出從下面的二叉搜索樹中刪除關鍵碼40后的結果。

***604050

12.對關鍵字序列(25, 16, 34, 39, 28, 56),1)畫出按此序列生成的二叉搜索樹。2)計算等概率下查找成功時的平均查找長度。

13.輸入一個正整數序列(53,17,12,66,58,70,87,25,56,60),試完成下列各題。

(1)按次序構造一棵二叉搜索樹BS。

(2)依此二叉搜索樹,如何得到一個從大到小的有序序列?

(3)假定每個元素的查找概率相等,試計算該二叉搜索樹的平均查找長度(4)畫出在此二叉搜索樹中刪除“66”后的樹結構。

14.試推導深度為5的平衡二叉樹最少包含多少個結點,并畫出一棵這樣的樹。

15.畫出在一個初始為空的AVL樹中依次插入3,1,4,6,9,8,5,7時每一插入后AVL樹的形態。若做了某種旋轉,說明旋轉的類型。

16.給定一個關鍵字序列4,5,7,2,1,3,6,生成一棵AVL樹,畫出構造過程。

17.給定關鍵字序列4,5,7,2,1,3,6,分別生成二叉搜索樹和AVL樹,并用二叉搜索樹和AVL樹兩種方法查找,給出查找6的查找次數及查找成功的平均查找長度。

18.給定關鍵詞輸入序列{CAP, AQU, PIS, ARI, TAU, GEM, CAN, LIB, VIR, LEO, SCO},假定關鍵詞比較按英文字典序,試畫出從一棵空樹開始,依上述順序(從左到右)輸入關鍵詞,用AVL樹的插入算法生成一棵AVL樹的過程,并說明生成過程中采用了何種轉動方式進行平衡調整,標出樹中各結點的平衡因子。

參考答案

一、6-10.ABCCC 1-5.BCABC

二、6-10.××××√ 11-13.√√× 1-5.√√√√×

三、1.2.3.4.5.6.7.8.9.四、1.中序

二叉搜索樹 小于,大于

查找成功,左子樹,右子樹 左子樹,右子樹 O(n2)平衡因子 7, 15 1

2.3.ASL=(1+2*2+3*3+4*3)/9 = 26/9 = 2.89 4.前序:18 10 5 73 68 27 25 41 32 51 99 后序:5 10 25 32 51 41 27 68 99 73 18 5.6.7.二叉搜索樹如圖所示,平均查找長度等于32/10。

8.平均查找長度=1+2×2+3×2+4×2=19/7。

9.二叉搜索樹

刪除72后的二叉搜索樹

10.11.或12.(1)

(2)(1+2*2+3*2+4*1)/6 = 2.5

13.(1)構造的二叉搜索樹為:(4)刪除結點66后

(2)對于一個二叉搜索樹,想得到一個從大到小的序列只要先讀右子樹再讀根結點,最后讀左子樹的遍歷這顆二叉樹就可以了。如果是要從小到大的序列,則只需中序遍歷這顆二叉樹即可。

(3)該二叉樹的平均查找長度為:ASL=(1*1+2*2+3*4+4*3)/10=2.9 14.略 15.16.17.二叉搜索樹

AVL樹

從二叉搜索樹查找6需4次,平均查找長度ASL=(1+2+2+3+3+3+4)/7=18/7≈2.57。從平衡二叉樹查找6需2次,平均查找長度ASL=(1+2+2+3+3+3+3)=17/7≈2.43。18.單向左旋 先右旋后左旋

第五篇:數據結構第九章排序習題及答案[小編推薦]

習題九

排序

一、單項選擇題

1.下列內部排序算法中:

A.快速排序 B.直接插入排序 C.二路歸并排序 D.簡單選擇排序 E.起泡排序 F.堆排序

(1)其比較次數與序列初態無關的算法是()(2)不穩定的排序算法是()

(3)在初始序列已基本有序(除去n個元素中的某k個元素后即呈有序,k<

(4)排序的平均時間復雜度為O(n?logn)的算法是()為O(n?n)的算法是()2.比較次數與排序的初始狀態無關的排序方法是()。

A.直接插入排序 B.起泡排序 C.快速排序 D.簡單選擇排序 3.對一組數據(84,47,25,15,21)排序,數據的排列次序在排序的過程中的變化為(1)84 47 25 15 21(2)15 47 25 84 21(3)15 21 25 84 47(4)15 21 25 47 84 則采用的排序是()。

A.選擇 B.冒泡 C.快速 D.插入

4.下列排序算法中()排序在一趟結束后不一定能選出一個元素放在其最終位置上。

A.選擇 B.冒泡 C.歸并 D.堆 5.一組記錄的關鍵碼為(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)6.下列排序算法中,在待排序數據已有序時,花費時間反而最多的是()排序。A. 冒泡 B.希爾 C.快速 D.堆

7.就平均性能而言,目前最好的內排序方法是()排序法。

A.冒泡 B.希爾插入 C.交換 D.快速 8.下列排序算法中,占用輔助空間最多的是:()A.歸并排序 B.快速排序 C.希爾排序 D.堆排序

9.若用冒泡排序方法對序列{10,14,26,29,41,52}從大到小排序,需進行()次比較。

A.3 B.10 C.15 D.25 10.快速排序方法在()情況下最不利于發揮其長處。

A.要排序的數據量太大 B.要排序的數據中含有多個相同值 C.要排序的數據個數為奇數 D.要排序的數據已基本有序 11.下列四個序列中,哪一個是堆()。

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 12.有一組數據(15,9,7,8,20,-1,7,4),用堆排序的篩選方法建立的初始堆為()

A.-1,4,8,9,20,7,15,7 B.-1,7,15,7,4,8,20,9 C.-1,4,7,8,20,15,7,9 D.A,B,C均不對。

二、填空題

1.若待排序的序列中存在多個記錄具有相同的鍵值,經過排序,這些記錄的相對次序仍然保持不變,則稱這種排序方法是________的,否則稱為________的。

2.按照排序過程涉及的存儲設備的不同,排序可分為________排序和________排序。

3.直接插入排序用監視哨的作用是___________________________。

4.對n個記錄的表r[1..n]進行簡單選擇排序,所需進行的關鍵字間的比較次數為_______。

5.下面的c函數實現對鏈表head進行選擇排序的算法,排序完畢,鏈表中的結點按結點值從小到大鏈接。請在空框處填上適當內容,每個空框只填一個語句或一個表達式: #include typedef struct node {char data;struct node *link;}node;node *select(node *head){node *p,*q,*r,*s;p=(node *)malloc(sizeof(node));p->link=head;head=p;while(p->link!=null){q=p->link;r=p;while((1)____________){ if(q->link->datalink->data)r=q;q=q->link;} if((2)___________){s=r->link;r->link=s->link;

s->link=((3)_________);((4)_________);}((5)________);} p=head;head=head->link;free(p);return(head);}

6.下面的排序算法的思想是:第一趟比較將最小的元素放在r[1]中,最大的元素放在r[n]中,第二趟比較將次小的放在r[2]中,將次大的放在r[n-1]中,…,依次下去,直到待排序列為遞增序。(注:<-->)代表兩個變量的數據交換)。

void sort(SqList &r,int n){ i=1;while((1)______){ min=max=1;for(j=i+1;(2)________;++j){if((3)________)min=j;else if(r[j].key>r[max].key)max=j;} if((4)_________)r[min] <---->r[j];if(max!=n-i+1){if((5)_______)r[min] <----> r[n-i+1];else((6)______);} i++;} }//sort

7.下列算法為奇偶交換排序,思路如下:第一趟對所有奇數的i,將a[i]和a[i+1]進行比較,第二趟對所有偶數的i,將a[i]和a[i+1]進行比較,每次比較時若a[i]>a[i+1],將二者交換;以后重復上述二趟過程,直至整個數組有序。

void oesort(int a[n]){int flag,i,t;do {flag=0;for(i=1;ia[i+1]){flag=(1)______;t=a[i+1];a[i+1]=a[i];(2)________;} for(3)________ if(a[i]>a[i+1]){flag=(4)________;t=a[i+1];a[i+1]=a[i];a[i]=t;} }while(5)_________;}

第九章 排序

一、單項選擇題 1.(1)DC(2)ADF(3)B(4)ACF BDE 2.D 3.A 4.C 5.C 6.C 7.D 8.A 9.C 10.D 11.C 12.C

二、填空題 1.穩定、不穩定 2.內部、外部

3.免去查找過程中每一步都要檢測整個表是否查找完畢,提高了查找效率。4.n(n-1)/2 5.題中為操作方便,先增加頭結點(最后刪除),p指向無序區的前一記錄,r指向最小值結點的前驅,一趟排序結束,無序區第一個記錄與r所指結點的后繼交換指針。

(1)q->link!=NULL(2)r!=p(3)p->link(4)p->link=s(5)p=p->link 6..(1)ir[n-i+1] 7.(1)1(2)a[i]=t(3)(i=2;i<=n;i+=2)(4)1(5)flag

下載數據結構習題(可用)word格式文檔
下載數據結構習題(可用).doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    紀委可用材料

    為進一步明確安全生產職責,落實安全生產責任,切實加強安全生產工作,保障人民生命財產安全,根據《天津市安全生產責任制規定》(市政府第24號令),本著屬地監管和誰主管誰負責、誰審批......

    辭職報告可用

    辭 職 報 告 我很遺憾自己在這個時候向公司正式提出辭職。 來到本公司也快七年了,正是在這里我開始踏上了社會,完成了自己從一個學生到社會人的轉變。有過歡笑,有過收獲,也有過......

    無知者無畏可用材料

    話題作文“不知者無畏” 【可用事例:】 1. 被“時間”忽悠的礦工們。 這是發生在非洲的一個真實的故事。 6名礦工在很深的井下采煤。突然,礦井坍塌,出口被堵住,礦工們頓時與外界......

    數據結構參考材料[范文大全]

    數據結構參考題目 一、選擇 1.如果在數據結構中每個數據元素只可能有一個直接前驅,但可以有多個直接后繼,則該結構是( ) A.棧 B.隊列 C. 樹 D.圖 2.下面程序段的時間復雜度為( ) f......

    嚴蔚敏 數據結構課后習題及答案解析

    第一章 緒論 一、選擇題 1.組成數據的基本單位是( ) (A)數據項(B)數據類型(C)數據元素(D)數據變量2.數據結構是研究數據的( )以及它們之間的相互關系。(A)理想結構,物理結構 (B)理想結構,抽......

    可用好詞好句

    1民國舊憶。他是八旗最后的皇親國戚;她是空有貴族名頭的京城第一美人;她是出淤泥而不染,愿得一心人,白首不相離的當紅戲子。大家族的束縛,家國洪流的巨變,他救不了愛情,救不了根深......

    趣味知識講座可用

    趣味語文知識講座 主講人: 尉琳海 李天宏 李明亮 【人體名稱妙喻】 頭腦、心臟、骨頭、手足??這是我們身體上的器官。你知道嗎,這些人體名稱有著它們巧妙的比喻義。恰當地運......

    2010班委工作總結(可用)

    工作著,快樂著 時間在指縫中悄悄流走,它送走了我們大一的第一學期,迎來了大一的第二個學期。在上個學期中我和我們化一班的同學們在一起分享了每一天每一個快樂的時光,上個學期......

主站蜘蛛池模板: 精品日产卡一卡二卡国色天香| 精品国产一区二区三区久久| 少妇把腿扒开让我添| 成人乱码一区二区三区四区| 成 人免费va视频| 欧美一区二区三区性视频| 无码av中文字幕久久专区| 无码av不卡一区二区三区| 一本久道久久综合久久爱| 亚洲精品一区二区三区四区手机版| 亚洲精品少妇30p| 九九综合va免费看| 亚洲精品久久一区二区三区四区| 一本色道久久88亚洲精品综合| 国模冰莲极品自慰人体| 无码人妻精一区二区三区| 欧美亚洲国产精品久久高清| 中文字幕久久波多野结衣av不卡| 国产97人人超碰cao蜜芽prom| 亚洲va久久久噜噜噜久久4399| 中文天堂网www新版资源在线| 亚洲成av人片在线观看ww| 无码少妇精品一区二区免费动态| 亚洲成a人片在线观看日本| 亚洲国产精品嫩草影院久久| 亚洲区精品区日韩区综合区| 波多野结衣乱码中文字幕| 亚洲娇小与黑人巨大交| 日韩亚洲国产主播在线不卡| 色窝窝免费一区二区三区| 韩国专区福利一区二区| 动漫av永久无码精品每日更新| 少妇乱人伦无码视频| 国产成人精品aa毛片| 久久av无码精品人妻系列试探| 无码精品不卡一区二区三区| 国产av剧情md精品麻豆| 亚洲熟女少妇一区二区| 久久婷婷香蕉热狠狠综合| 窝窝午夜理论片影院| 精品久久久久久久久中文字幕|