前言
這是我聽老師講課做的筆記,考試要看的。
作者:RodmaChen
關注我的csdn博客,更多數據結構與算法知識還在更新
數據結構期末複習必備
- 第一章 緒 論
- 第二章
- 考點
- 習題
- 1.帶頭結點的單鏈表head爲空的判斷條件是( )。
- 2.若某線性表中最常用的操作是在最後一個元素之後插入一個元素和刪除第一個元素,則採用( )存儲方式最節省運算時間。
- 3.若長度爲n的線性表採用順序存儲結構,在其第i個位置插入一個新元素算法的時間複雜度爲( )。
- 4.在雙循環鏈表p所指結點之後插入s所指結點的操作是( )。
- 5.在一個單鏈表中,已知q所指結點是p所指結點的前驅結點,若在q結點和p結點之間插入s結點,則執行( )
- 6.順序存儲的線性表可以按序號隨機存取。
- 7.在單鏈表中和在順序表中插入一個元素其時間複雜度均爲O(n),因此說它們的執行時間是相等的。
- 8.如圖所示的雙向鏈表中,欲在結點p前插入一個結點s,請完成有關操作。
- 9.試描述頭指針、頭結點、開始結點的區別,並說明頭指針和頭結點的作用。
- 10.已知帶頭結點的單鏈表L中的結點是按整數值遞增排列的,試寫一個算法,將值爲x 的結點插入到表L中,使得L仍然有序。並且分析算法的時間複雜度。
- 第三章 棧和隊列
- 考點
- 習題
- 1.設有一順序棧S,元素s1、s2、s3、s4、s5、s6依次進棧,如果6個元素出棧的順序是s2、s4、s3、s6、s5、s1,則棧的容量至少應該是( )。
- 2.設已將元素a1、a2、a3依次入棧,元素a4正等待進棧。那麼下列4個序列中不可能出現的出棧序列是( )。
- 3.向一個棧頂指針爲top的鏈棧中插入一個s所指結點時,其操作步驟爲( )。
- 4.從棧頂指針爲top 的鏈棧中刪除一個結點,並將被刪除結點的值保存到x中,其操作步驟爲( )。
- 5.鏈棧與順序棧相比,有一個較明顯的優點是( )。
- 6.設數組A[m]作爲循環隊列sq的存儲空間,front爲隊頭指針,rear爲隊尾指針,則執行入隊操作時修改指針的語句是( )。
- 7.在一個鏈隊列中,若f、r分別爲隊首、隊尾指針,則插入s所指結點的操作爲( )。
- 8.棧的邏輯特點是( )。隊列的邏輯特點是( )。二者的共同點是隻允許在它們的( )處插入和刪除數據元素,區別是( )。
- 第五章 數組和廣義表
- 第六章 樹
- 考點
- 習題
- 1.下列說法正確的是( )。
- 2.哈夫曼樹是帶權路徑長度最短的樹,路徑上權值較大的結點離根較近。
- 3.完全二叉樹可採用順序存儲結構實現存儲,非完全二叉樹則不能。
- 4.存在這樣的二叉樹,對其採用任何次序的遍歷,結果相同。
- 5.深度爲k的完全二叉樹至少有 個結點,至多有 個結點。
- 6.(1)已知一棵二叉樹的前序序列和中序序列分別爲ABDGHCEFI和GDHBAECIF,求其對應的二叉樹。(2)已知一棵二叉樹的中序序列和後序序列分別爲BDCEAFHG和DECBHGFA,求其對應的二叉樹。(3)若前序序列和後序序列均爲AB和BA能否惟一確定一棵二叉樹。
- 7.用於通信的電文由字符集{a,b,c,d,e,f,g,h}中的字母構成,這8個字母在電文中出現的概率分別爲{0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10}。
- 8.求樹的高度的算法:
- 9.以二叉鏈表爲存儲結構,寫一算法交換各結點的左右子樹。
- 10.對於下圖所示二叉樹,試給出:
- 11.在結點數多於1的哈夫曼樹中不存在度爲1的結點。哈夫曼樹中有n個葉結點 ,則樹中共有2n-1個結點。
- 12.畫出和下列已知序列對應的二叉樹:
- 13.畫出和下列已知序列對應的二叉樹:
- 14.畫出和下列已知序列對應的二叉樹:
- 15.給定一棵二叉樹,其根指針爲root。試寫出求二叉樹結點數目的算法(遞歸算法或非遞歸算法)。
- 1.以下說法錯誤的是( )。
- 2.由樹轉換成二叉樹,根結點沒有左子樹。
- 第七章 圖
第一章 緒 論
考點
1、 三個基本概念
數據項 是最小的不可分隔的數據單位
數據元素 是最基本處理單位
數據對象 是同種類型數據元素的集合
2、 數據結構包括:邏輯結構、存儲結構、運算(操作)三方面內容
邏輯結構(集合、線性、樹、圖)
線性結構特點是一對一。
樹特點是一對多
圖特點是多對多
存儲結構(順序、鏈式、索引、散列)
操作(定義在邏輯結構、實現在存儲結構)
3、 算法的概念
4、 五大特點
有窮性、確定性、可行性、輸入、輸出
5、 算法的度量
時間複雜度(f(n) n代表問題的規模,o(f(n))
空間複雜度
6、 語句的頻度
習題
1.數據結構是一門研究非數值計算程序設計中計算機的 ① 以及它們之間的 ② 和運算等的學科。
① A.操作對象 B.計算方法 C.邏輯存儲 D.數據映像
② A.結構 B.關係 C.運算 D.算法
【分析】數據結構是一門研究非數值計算程序設計中計算機的操作對象以及它們之間關係和運算等的學科。
【答案】① A ② B
2.從邏輯上可以把數據結構分爲 。
A.動態結構和靜態結構 B.緊湊結構和非緊湊結構
C.線性結構和非線性結構 D.內部結構和外部結構
【分析】數據的邏輯結構有兩類,分別是線性結構和非線性結構。
【答案】C
3.線性結構的順序存儲結構是一種 ① 的存儲結構,線性結構的鏈式存儲是一種 ② 的存儲結構。
A.隨機存取 B.順序存取 C.索引存取 D.散列存取
【分析】順序存儲結構是一種隨機存取結構,鏈式存儲結構是一種順序(一個個結點的查找)存取結構。
【答案】① A ② B
4.下面程序的時間複雜度爲 。
for (i=0;i<m;i++)
for (j=0;j<n;j++)
A[i][j]=i*j;
A.O(m2) B.O(n2) C.O(m×n) D.O(m+n)
【分析】第一個for循環執行m次,第二個for循環執行n次,兩個for循環嵌套起來共執行m×n次。
【答案】C
5.線性結構中元素的關係是 ① ,樹形結構中元素的關係是 ② ,圖形結構中元素的關係是 ③ 。
【答案】①一對一;② 一對多;③多對多
6.算法的5個重要特性是 。
【答案】有窮性;確定性;可行性;輸入;輸出
第二章
考點
1、 邏輯結構爲線性表(1:1、同一線性表中的數據元素必須同種類型、n代表線性表的表長)
2、 兩種存儲-順序表(隨機存取、物理相鄰體現邏輯相鄰)
語言描述、操作(查找、插入、刪除、逆序、兩表合併)
Typedef struct
{datatype data[MAXSIZE];
Int length;}SqList;
SqList l ; l.data[2]
3、 兩種存儲-鏈表(順序存取,單向鏈表、單循環鏈表、雙鏈表、雙循環鏈表)
語言描述、操作(查找、插入、刪除、逆序、兩表合併,單鏈表倒數)
Typedef struct node
{datatype data;
Struct node *next;}*LinkList ,ListNode;
兩種存儲結構的運算:
(1) 順序表的查找、單鏈表的查找
(2) 順序表的插入和刪除、單鏈表的插入和刪除
(3) 鏈表的合併(遞增的兩個鏈表合併爲遞增或遞減的單鏈表,將一個鏈表頭鏈到另一個鏈表尾)
(4) 順序表和單鏈表就地逆序
習題
1.帶頭結點的單鏈表head爲空的判斷條件是( )。
A.head== NULL B.head->next== NULL
C.head->next==head D.head!=NULL
【分析】鏈表爲空時,頭結點的指針域爲空。
【答案】B
2.若某線性表中最常用的操作是在最後一個元素之後插入一個元素和刪除第一個元素,則採用( )存儲方式最節省運算時間。
A.單鏈表 B.僅有頭指針的單循環鏈表
C.雙鏈表 D.僅有尾指針的單循環鏈表
【分析】根據題意要求,該線性表的存儲應能夠很方便地找到線性表的第一個元素和最後一個元素,A和B都能很方便地通過頭指針找到線性表的第一個元素,卻要經過所有元素才能找到最後一個元素;選項C雙鏈表若存爲雙向循環鏈表,則能很方便地找到線性表的第一個元素和最後一個元素,但存儲效率要低些,插入和刪除操作也略微複雜;選項D可通過尾指針直接找到線性表的最後一個元素,通過線性表的最後一個元素的循環指針就能很方便地找到第一個元素。
【答案】D
3.若長度爲n的線性表採用順序存儲結構,在其第i個位置插入一個新元素算法的時間複雜度爲( )。
A.O(log2n) B.O(1)
C.O(n) D.O(n2)
【分析】在第i個位置上插入新元素需要從最後一個元素開始後移直到第i個元素後移爲止,後移元素的次數爲n-i+1,即時間複雜度爲O(n)。
【答案】C
4.在雙循環鏈表p所指結點之後插入s所指結點的操作是( )。
A.p->next=s; s->prior=p; p->next->prior=s; s->prior=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;
【分析】由於要將s所指結點插入到p所指結點之後,p結點爲s結點的前驅,s結點爲p結點的新後繼,而結點p的原後繼結點爲結點s的後繼結點,結點s爲結點p的原後繼結點的前驅結點。在選項A、B和C中均是先執行操作p->next=s,就是修改了結點p的後繼結點爲s結點,然後再執行操作p->next->prior=s,因此,無法使得結點s爲結點p的原後繼結點的前驅結點,這樣的賦值會使s結點爲其自身的前驅。應先執行操作p->next->prior=s,再執行操作p->next=s。
【答案】D
5.在一個單鏈表中,已知q所指結點是p所指結點的前驅結點,若在q結點和p結點之間插入s結點,則執行( )
A.s->next=p->next;p->next=s;
B.p->next=s->next;s->next=p;
C.q->next=s; s->next=p;
D.p->next=s; s->next=q;
【分析】由於是將s所指結點插入到q和p所指結點之間,即使其爲q所指結點的後繼結點,爲p所指結點的前驅結點,因此s->next的取值應爲p,p->next的取值無需改動,q->next的取值應改爲s,故A、B和D均是錯誤的。【答案】C
6.順序存儲的線性表可以按序號隨機存取。
【分析】因爲順序表在內存是用地址連續的空間存儲的,設 a1的存儲地址爲Loc(a1),每個數據元素佔d個存儲地址,則第i個數據元素的地址爲:
Loc(ai)=Loc(a1)+(i-1) *d 1<=i<=n
這就是說只要知道順序表首地址和每個數據元素所佔地址單元的個數就可求出第i個數據元素的地址來,這也是順序表具有按數據元素的序號隨機存取的特點。
【答案】正確
7.在單鏈表中和在順序表中插入一個元素其時間複雜度均爲O(n),因此說它們的執行時間是相等的。
8.如圖所示的雙向鏈表中,欲在結點p前插入一個結點s,請完成有關操作。
s->prior = p->prior;
p->prior=s;
s->next=p;
【解答】
只能是:s->prior->next=s; 而不能爲:
p->prior->next=s;
9.試描述頭指針、頭結點、開始結點的區別,並說明頭指針和頭結點的作用。
【解答】
頭指針是一個指針變量,裏面存放的是鏈表中首結點的地址,並以此來標識一個鏈表。如鏈表H,鏈表L等,表示鏈表中第一個結點的地址存放在H、L中。
頭結點是附加在第一個元素結點之前的一個結點,頭指針指向頭結點。當該鏈表表示一個非空的線性表時,頭結點的指針域指向第一個元素結點,爲空表時,該指針域爲空。
開始結點指第一個元素結點。
頭指針的作用是用來惟一標識一個單鏈表。
頭結點的作用有兩個:一是使得對空表和非空表的處理得以統一。二是使得在鏈表的第一個位置上的操作和在其他位置上的操作一致,無需特殊處理。
10.已知帶頭結點的單鏈表L中的結點是按整數值遞增排列的,試寫一個算法,將值爲x 的結點插入到表L中,使得L仍然有序。並且分析算法的時間複雜度。
【提示】先在單鏈表中順序比較,找到插入位置,再生成結點,插入。
typedef struct node{
int data;
struct node *next;
}Lnode,*Linklist;
Linklist insert(Linklist L,int x){
//將值爲x 的結點插入到有序的單鏈表L中
Lnode *p,*s;
p=L;
while (p->next && x>p->next->data)
p=p->next; //找插入位置
s=new Lnode;
s->data=x; //申請、填裝結點
s->next=p->next;
p->next=s; //插入到鏈表中去
return L;
}
第三章 棧和隊列
考點
棧的考點
1、棧的特點是什麼?棧和線性表的區別是什麼?
答:只允許在線性表的同一端進行插入和刪除的線性表。做插入和刪除那一端叫做棧頂,不能做插入和刪除的那一端叫做棧底。
線性表則是隻要是合法的位置都可以做插入和刪除。
2、先進後出(FILO, First In Last Out)或後進先出(LIFO)
3、如果入棧的順序爲ABC,則出棧的順序可以爲ABC,CBA,BAC,BCA等。
4、順序棧:順序存儲結構的棧稱爲順序棧。
鏈棧: 鏈式存儲結構棧稱爲鏈棧。
5、順序棧的語言描述(靜態)
#define StackSize 100
typedef char DataType;
typedef struct
{ DataType data[StackSize];
int top;
}SeqStack;
SqStack sq;
6、動態語言描述(教材):
typedef struct
{ selemtype *base;
selemtype *top;
int stacksize;
}SqStack;
SqStack sq;
sq.base=(selemtype *)malloc(Maxsize*sizeof(selemtype));
sq.top=sq.base;
7、靜態和動態下的棧空、入棧、出棧、讀棧頂元素、棧滿的操作
8、順序棧靜態運算的實現
9、順序棧動態運算的實現
隊列的考點
一、隊列的特點?隊列和棧的區別?線性表的特點?
答:隊列指的是一端做插入(隊尾),另一端做刪除(隊頭)。
二、如果入隊順序爲ABC,則出隊順序只能是ABC
如果入棧爲ABC,則出棧順序可以有ABC,BAC,CBA,ACB等。
三、隊列可以採取順序存儲(順序隊)和鏈式存儲(鏈隊)
四、順序隊的靜態實現
1.結構體語言描述
typedef struct queue
define MAXSIZE 1024 /*隊列的最大容量*/
typedef struct
{datatype data[MAXSIZE]; /*隊員的存儲空間*/
int rear,front; /*隊頭隊尾指針*/
}SeQueue;
定義一個指向隊的指針變量:
SeQueue *sq;
2.靜態實現的基本操作
假溢出現象,提出了循環隊列。
3.什麼是循環隊列?
循環隊列中rear和front操作要會。
4.循環隊列的語言描述,這個實際上和前面的順序隊的語言描述一樣
語言描述:
typedef struct
{ datatype data[m] ;
int front ; int rear ;
int count ; //統計隊列中元素點數
} cirqueue ;
cirqueue *q
5.循環隊列的基本操作
五、循環隊列的動態語言描述以及基本操作
七、鏈隊
指的是在單鏈表的首結點上做刪除,在尾結點上做插入。
八、理解順序表、順序棧、順序隊的區別?
理解鏈表、鏈棧、鏈隊的區別?
順序表:可以在任意合法的位置上做插入和刪除。
順序棧:只可以在順序表的同一端上做插入和刪除。
順序隊:在順序表的一端做插入,另一端做刪除。
鏈表:可以在任意合法的位置上做插入和刪除。
鏈棧:只可以在鏈表的首結點位置做插入和刪除。
鏈隊:在鏈表的首結點位置做刪除,尾結點後做插入。
習題
1.設有一順序棧S,元素s1、s2、s3、s4、s5、s6依次進棧,如果6個元素出棧的順序是s2、s4、s3、s6、s5、s1,則棧的容量至少應該是( )。
A.2 B.3 C.5 D.6
【分析】s1、s2進棧後,此時棧中有2個元素,接着s2出棧,棧中尚有1個元素s1;s3、s4 進棧後,此時棧中有3個元素,接着s4、s3出棧,棧中尚有1個元素s1;s5、s6 進棧後,此時棧中有3個元素,接着s6、s5出棧,棧中尚有1個元素s1;s1出棧後,此時棧爲空棧。由此可知,棧的容量至少應該是3。
【答案】B
2.設已將元素a1、a2、a3依次入棧,元素a4正等待進棧。那麼下列4個序列中不可能出現的出棧序列是( )。
A.a3 a1 a4 a2 B.a3 a2 a4 a1 C.a3 a4 a2 a1 D.a4 a3 a2 a1
【分析】由於a1、 a2 、a3 已進棧,此時,棧頂元素爲a3,不管a4何時進棧,出棧後,a1、a2 、a3的相對位置一定是不變的,這就是a3一定在前,a2一定居中,a1一定在後。比較上述4個答案,只有A中的a1出現在 a2 的前面,這顯然是錯誤的。
【答案】A
3.向一個棧頂指針爲top的鏈棧中插入一個s所指結點時,其操作步驟爲( )。
A.top->next=s; B.s->next=top->next; top->next=s;
C.s->next=top; top=s; D.s->next=top; top=top->next;
【分析】本操作是在鏈棧上的進棧操作。操作順序應該是先插入結點,再改變棧頂指針。
【答案】C
4.從棧頂指針爲top 的鏈棧中刪除一個結點,並將被刪除結點的值保存到x中,其操作步驟爲( )。
A.x=top->data; top=top->next; B.top=top->next; x=top->data;
C.x=top; top=top->next; D.x=top->data;
【分析】本操作是在鏈棧上進行出棧操作,操作順序應該是先保存被刪除結點的值,然後再改變棧頂指針的值。
【答案】A
5.鏈棧與順序棧相比,有一個較明顯的優點是( )。
A.通常不會出現棧滿的情況 B.通常不會出現棧空的情況
C.插入操作更加方便 D.刪除操作更加方便
【分析】不管是鏈棧還是順序棧,其插入、刪除操作都是在棧頂進行的,都比較方便,所以不可能選C,D。對鏈棧來說,當棧中沒有元素而又要執行出棧操作時,就會出現棧空現象,故B也是不正確的。只要內存足夠大,鏈棧上就不會出現棧滿現象。而對順序棧來講,由於其大小是事先確定好的,因此可能會出現棧滿現象。
【答案】A
6.設數組A[m]作爲循環隊列sq的存儲空間,front爲隊頭指針,rear爲隊尾指針,則執行入隊操作時修改指針的語句是( )。
A.sq.front=(sq.front+1)%m B.sq.front=(sq.front+1)%(m+1)
C.sq.rear=(sq.rear+1)%m D.sq.rear=(sq.rear+1)%(m+1)
【分析】首先,執行的入隊操作是在隊尾進行的,故A,B肯定是不對的。其次,由於存放sq的數組爲A[m],數組元素爲A[0]~a[m-1],共有m個單元,%運算中的模應爲m。
【答案】C
7.在一個鏈隊列中,若f、r分別爲隊首、隊尾指針,則插入s所指結點的操作爲( )。
A.f->next=c; f=s; B.r->next=s; r=s;
C.s->next=r; r=s; D.s->next=f;f=s;
【分析】插入操作總是在隊尾進行,而且應該先插入結點,再改變隊尾指針的值。
【答案】B
8.棧的邏輯特點是( )。隊列的邏輯特點是( )。二者的共同點是隻允許在它們的( )處插入和刪除數據元素,區別是( )。
【分析】由於只能在棧頂處執行插入、刪除操作,使得數據元素的進棧順序恰好與出棧順序相反,所以棧的邏輯特點是先進後出(或後進先出)。而對於隊列來說,插入、刪除操作必須在隊列的兩端進行,數元素的進隊順序是一致的,所以隊列的邏輯特點是先進先出(或後進後出)。兩者的共同特點是所有操作只能在端點處進行。
【答案】先進後出(或後進先出);先進先出(或後進後出);端點;棧是在同一端插入和刪除,隊列是在一端插入而在另一端刪除。
第五章 數組和廣義表
考點
一、數組不能做插入和刪除,只能做取值和賦值操作。
二、數組只能採取順序存儲(行優先和列優先)
三、數組行優先計算公式(下標從0和1開始)
數組列優先計算公式(下標從0和1開始)
四、爲什麼要對特殊矩陣進行壓縮存儲?
答:主要爲了節省存儲空間。
五、對稱矩陣和三角矩陣各長什麼樣?
六、F[k],對稱矩陣的壓縮存儲所需存儲空間至少n(n+1)/2。存儲計算公式。
三角矩陣的壓縮存儲所需存儲空間至少n(n+1)/2+1。
七、對稱矩陣的壓縮存儲可以存其下三角上的元素或其上三角上的元素。瞭解公式
八、三角矩陣的壓縮存儲可以存其下三角上的元素或其上三角上的元素。但是必須多一個單元存常數C. 瞭解公式
九、稀疏矩陣長什麼樣?
十、稀疏矩陣存儲方法有兩種:三元組表和十字鏈表
十一、瞭解廣義表,瞭解廣義表取表頭和表尾操作。
習題
1.數組M中每個元素的長度是3個字節,行下標i從0到7,列下標j從0到9,從首地址EA開始連續存放在存儲器中。若按行優先方式存放,元素M[7][5]的起始地址爲( );若按列優先方式存放,元素M[7][5]的起始地址爲( )。
【分析】
按行優先方式存儲時,M[7][5]的前面已經存放了75(7×10+5=75)個元素,它們共佔用了75×3=225個字節,所以M[7][5]的起始地址爲EA+225。
按列優先方式存儲時,M[7][5]的前面已經存放了47(5×8+7=47)個元素,它們共佔用了47×3=141個字節,所以M[8][5]的起始地址爲EA+141。
【答案】EA+225;EA+141
2.設二維數組的每個元素佔4個字節,已知,A共佔多少個字節?A的終端結點a45的起始地位爲何?按行和按列優先存儲時,的起始地址分別爲何?
【解答】
因爲4×5×6=120,所以二維數組A5×6共佔120個字節;
LOC(a45)=1000+120-4=1116;
按行優先時LOC(a25)=1000+4×(2×6+5)=1068;
按列優先時LOC(a25)=1000+4×(5×5+2)=1108。
第六章 樹
考點
1、樹的相關定義
樹分爲有序樹和無序樹
樹高 度
2、二叉樹的性質和存儲
第 i層最多 前k層至多
順序存儲(完全二叉樹)
鏈式二叉
3、二叉樹的遍歷
前序、中序、後序
給出一棵二叉樹,寫出先中後序列
給先+中 後+中 寫出另一種序列
遞歸寫算法
3、線索化二叉樹
4、樹和森林與二叉樹的轉換
5、赫夫曼樹
6、遞歸在樹的求解問題中的應用
習題
1.下列說法正確的是( )。
A.二叉樹中任何一個結點的度都爲2
B.二叉樹的度爲2
C.一棵二叉樹的度可小於2
D.任何一棵二叉樹中至少有一個結點的度爲2
【分析】二叉樹是樹形結構的一種,但不是二度樹,也不是二度樹的特例,比如二叉樹包括空樹,也包括只有一個根結點的情況,也包括只有度爲0和度爲1結點的情況。
【答案】C
2.哈夫曼樹是帶權路徑長度最短的樹,路徑上權值較大的結點離根較近。
【分析】因爲這樣才能保證其帶權路徑長度最短。
【答案】正確
3.完全二叉樹可採用順序存儲結構實現存儲,非完全二叉樹則不能。
【分析】對於非完全二叉樹進行順序存儲時需按照完全二叉樹順序存儲的順序將空結點也存入。
【答案】錯誤
4.存在這樣的二叉樹,對其採用任何次序的遍歷,結果相同。
【分析】當二叉樹只有一個結點時,三種遍歷序列均相同。
【答案】正確
5.深度爲k的完全二叉樹至少有 個結點,至多有 個結點。
【分析】深度爲k的完全二叉樹最少結點時是前k-1層爲滿二叉樹,第k層只有一個結點,故有2k-1 個結點;深度爲k的完全二叉樹最多結點時是k層的滿二叉樹。
【答案】2k-1;2k-1
6.(1)已知一棵二叉樹的前序序列和中序序列分別爲ABDGHCEFI和GDHBAECIF,求其對應的二叉樹。(2)已知一棵二叉樹的中序序列和後序序列分別爲BDCEAFHG和DECBHGFA,求其對應的二叉樹。(3)若前序序列和後序序列均爲AB和BA能否惟一確定一棵二叉樹。
【解答】
(1)知道二叉樹的前序序列和中序序列能惟一確定一棵二叉樹,(1)對應的二叉樹如圖(1)所示。
(2)知道二叉樹的中序序列和後序序列能惟一確定一棵二叉樹,(2)對應的二叉樹如圖(2)所示。
(3)知道二叉樹的前序序列和後序序列不能惟一確定一棵二叉樹,如圖(3)所示的兩棵二叉樹的前序和後序序列是相同的。
根據前序、中序和後序的遍歷特點,如果知道一棵樹的前序序列,則第一個結點就是根結點,後序序列的最後一個結點是根結點,但都沒有辦法確定左右子樹,而對於中序來說,當知道了根結點之後,恰好能分離出左右子樹來,因此在二叉樹中的結點值均不相同的情況下,則由二叉樹的前序序列和中序序列,或由其後序序列和中序序列均能惟一地確定一棵二叉樹,而由前序序列和後序序列卻不能惟一地確定一棵二叉樹。
7.用於通信的電文由字符集{a,b,c,d,e,f,g,h}中的字母構成,這8個字母在電文中出現的概率分別爲{0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10}。
(1)爲這8個字母設計哈夫曼編碼。
(2)若用三位二進制數(0~7)對這8個字母進行等長編碼,則哈夫曼編碼的平均碼長是等長編碼的百分之幾?它使電文總長平均壓縮多少?
【解答】
(1)首先構造哈夫曼樹:
根據哈夫曼樹,各字符的編碼如下:
字符 頻率 編碼
a 0.07 0000
b 0.19 10
c 0.02 00100
d 0.06 0011
e 0.32 01
f 0.03 00101
g 0.21 11
h 0.10 0001
(2)哈夫曼編碼平均碼長爲:
4×0.07+2×0.19+5×0.02+4×0.06+5×0.03+2×0.21+4×0.1=2.71
因爲等長編碼的平均碼長爲3,所以哈夫曼編碼是等長編碼的2.71/3=0.90,它使電文平均壓縮了近10%。
8.求樹的高度的算法:
【分析】
空二叉樹的深度爲0,對非空二叉樹,其深度等於根結點的左子樹和右子樹中深度較大者的子樹的深度加1。故根據如下表達式採用後序遞歸遍歷算法實現:
【算法】
int Depth(BiTree T){
int dep1,dep2;
if (T==NULL)
return 0;
else{
dep1=Depth(T->lchild); //求左子樹的深度
dep2=Depth(T->rchild); //求右子樹的深度
if (dep1>dep2)
return dep1+1;
else
return dep2+1;
}
}
9.以二叉鏈表爲存儲結構,寫一算法交換各結點的左右子樹。
【分析】
依題意,設t 爲一棵用二叉鏈表存儲的二叉樹,則交換各結點的左右子樹的運算基於後序遍歷實現:交換左子樹上各結點的左右子樹;交換右子樹上各結點的左右子樹;再交換根結點的左右子樹。
【算法】
void Exchg(BiTree *t){
BinNode *p;
if (t){
Exchg(&((*t)->lchild));
Exchg(&((*t)->rchild));
P=(*t)->lchild;
(*t)->lchild=(*t)->rchild;
(*t)->rchild=p;
}
}
10.對於下圖所示二叉樹,試給出:
(1)它的順序存儲結構示意圖。
(2)它的二叉鏈表存儲結構示意圖。
(3)它的三叉鏈表存儲結構示意圖。
11.在結點數多於1的哈夫曼樹中不存在度爲1的結點。哈夫曼樹中有n個葉結點 ,則樹中共有2n-1個結點。
12.畫出和下列已知序列對應的二叉樹:
二叉樹的先序次序訪問序列爲:GFKDAIEBCHJ。
二叉樹的中序訪問次序爲:DIAEKFCJHBG。
13.畫出和下列已知序列對應的二叉樹:
二叉樹的後序次序訪問序列爲:CFEGDBJLKIHA。
二叉樹的中序訪問次序爲:CBEFDGAJIKLH。
14.畫出和下列已知序列對應的二叉樹:
二叉樹的層次序列爲:ABCDEFGHIJ。
二叉樹的中序次序爲:DBGEHJACIF。
15.給定一棵二叉樹,其根指針爲root。試寫出求二叉樹結點數目的算法(遞歸算法或非遞歸算法)。
【提示】採用遞歸算法實現。
int count(BiTree t){
if (t==NULL)
return 0;
else
return count(t->lchild)+count(t->rchild)+1;
}
1.以下說法錯誤的是( )。
A.存在這樣的二叉樹,對其採用任何次序的遍歷其結點訪問序列均相同。
B.二叉樹是樹的特殊情形。
C.由樹轉換成二叉樹,其根結點的右子樹總是空的。
D.在二叉樹只有一棵子樹的情況下,也要指出是左子樹還是右子樹。
【分析】二叉樹的特點是僅有一個分支時也有左右之分,而樹無此特點,也即二叉樹不是樹的特殊情形。
【答案】B
2.由樹轉換成二叉樹,根結點沒有左子樹。
【分析】由樹轉換成二叉樹,根結點必有左子樹而沒有右子樹。
【答案】錯誤
第七章 圖
一、基本概念
- 圖
- 有向圖和無向圖
- 有向完全圖
n(n-1)
和無向完全圖n(n-1)/2
- 無向圖中頂點的度指的是和這個頂點關聯邊的條數。
- 有向圖度分入度和出度之和。
- 有向圖和無向圖中所有頂點度之和等於邊數的二倍。
- 理解連通、連通圖、強連通、強連通圖的概念、連通分量、強連通分量
- 在一個有向圖裏有n個入度,請問有幾個出度?答案:n
二、一個圖有兩種存儲結構:鄰接矩陣和鄰接表。
1.給出一個圖,必須會寫出其鄰接矩陣和鄰接表。
2.要會在鄰接矩陣和鄰接表上進行深度優先遍歷和廣度優先遍歷。
3.有向圖的鄰接表分成鄰接表(頂點表和出邊表)、逆鄰接表(頂點表和入邊表)
4.一棵有n個頂點的生成樹有n-1條邊但是有n個頂點, 有n-1條邊不一定是生成樹。
5.一個圖的鄰接矩陣唯一,但是其鄰接表不唯一。那麼在鄰接矩陣上進行深度優先遍歷和廣度優先遍歷一定唯一。在各自所畫的鄰接表上進行深度優先遍歷和廣度優先遍歷也是唯一的。
6.無向圖的鄰接表存儲單元共有(n+2e).其中n是頂點個數,2e是邊的二倍。 - 有向圖的鄰接表存儲單元共有(n+e)。其中n是頂點個數,e是邊數。
8.給出一個無向圖,大家要會畫出prim算法和克魯斯卡爾(Kruskal)算法求最小生成樹的執行過程。P174、P176
9.生成樹不唯一,
10.最小生成樹也不唯一,但是其求和的值一定是最小的,最小生成樹里加一條邊肯定有迴路。 - 拓撲排序是有向無環圖的一種應用,拓撲排序序列不唯一,會做拓撲排序。
課本P181 - 深度優先遍歷(DFS)和廣度優先遍歷(BFS)分別採用棧和隊列的數據結構來暫存頂點。
給出一個圖或一個鄰接矩陣,要求寫出深度優先和廣度優先遍歷。
三、圖的鄰接表如下圖所示:
(1)寫出從頂點v0出發進行深度優先搜索:v0 v1 v2 v3
(2)寫出從頂點v0出發進行廣度優先搜索vo v1 v3 v2。
四、對下面連通圖,請分別用Prim和Kruskal 算法構造其最小生成樹。
本人博客:https://blog.csdn.net/weixin_46654114
本人b站求關注:https://space.bilibili.com/391105864
轉載說明:跟我說明,務必註明來源,附帶本人博客連接。
請給我點個贊鼓勵我吧