5.1.6二叉樹的鏈式儲存結構
5.2 樹和森林
5.3 哈夫曼樹
※易錯點
樹是n(n≥0)個結點的有限值,當n=0時稱為空樹。
非空樹:
(1)有且僅有乙個稱之為根的結點
(2)除根結點以外的其餘結點可分為m個互不相交的有限集,其中每個集合本身又是一棵樹,稱為根的子樹。
樹的結構定義是乙個遞迴的定義。
二叉樹是n(n≥0)個結點所構成的合集。
非空二叉樹t:
(1)有且僅有乙個稱之為根的結點
(2)除根結點以外的其餘結點分為兩個互不相交的子集t1和t2,分別稱為t的左子樹和右子樹,且t1和t2本身都是二叉樹。
二叉樹與樹的主要區別:
(1)二叉樹的每個結點至多只有兩棵子樹,即不存在度大於2的結點。
(2)二叉樹的子樹有左右之分,次序不能任意顛倒。
其中,二叉樹有五種基本形態。
在第一次遍歷時將結點的前驅、後繼資訊儲存下來,便於再次遍歷二叉樹。
線索化:若無左子樹,則其左指標指向其前驅結點。若無右子樹,則其左指標指向其後繼結點。
在二叉樹的第i層上至多有2(i-1)個結點。(i≥1)
深度為k的二叉樹至多有2k-1個結點。(k≥1)
對任何一顆二叉樹t,如果其終端結點數為n0,度為2的結點數為n2,則n0=n2+1。
具有n個結點的完全二叉樹的深度為|log2
n|+1。
如果對一顆有n個結點的完全二叉樹(其深度為|log2
n|+1)的結點按層序編號(從第1層到第|log2
n|+1層,每層從左到右),則對任一結點i(1≤i≤n),有
(1)如果i=1,則結點i是二叉樹的根,無雙親;如果i>1,則雙親parent(i)是結點i/2。
(2)如果2i>n,則結點i無左孩子(結點i為葉子結點);否則其左孩子lchild(i)是結點2i。
(3)如果2i+1>n,則結點i無右孩子;否則其右孩子rchild(i)是結點2i+1。
順序儲存結構使用一組位址連續的儲存單元來儲存資料元素。結點按照一定的規律安排在這組單元中。
對於完全二叉樹,從根起按層序儲存,依次自上而下、自左至右儲存結點元素。(適用)
對於一般二叉樹,則應將其每個結點與完全二叉樹上的結點相對照,可以「0」表示不存在此結點。
#include
#include
using
namespace std;
char str[
1000];
void
bianli
(int i,
int n)
intmain()
return0;
}
#include
#include
using
namespace std;
char s[55]
;typedef
struct bilnodebilnode,
*bitree;
bitree create
(int i,
int l)
void
print
(bitree t)
}int
main()
return0;
}
設計不同的結點結構可構成不同形式的鏈式儲存結構。如二叉鍊錶,三叉鍊錶。
在含有n個結點的二叉鍊錶中有n+1個空鏈域。
利用空鏈域儲存其他有用資訊,可得到另一種鏈式儲存結構——線索鍊錶。
typedef
struct bitlnodebitlnode,
*bitree;
先序遍歷:根—左—右
中序遍歷:左—根—右
後序遍歷:左—右—根
層序遍歷:從上到下,從左至右
無論是哪種遍歷方式,其時間複雜度均為o(n),空間複雜度也為o(n)。
確定二叉樹:前+中、後+中
中序遍歷
遞迴演算法:
void
inorder
(bitree t)
}
非遞迴演算法:
void
inorder
(bitree t)
else
}}
層序遍歷void
cengxubianli
(bitree t)
}
先序遍歷建立二叉鍊錶void
create
(bitree t)
}
複製二叉樹void
copy
(bitree t,bitree &newt)
else
}
計算二叉樹的深度int
depth
(bitree t)
}
統計二叉樹中結點的個數int
nodecount
(bitree t)
}
統計二叉樹中葉結點的個數int
findye
(bitree t)
else
return
(num1+num2)
;}
統計二叉樹中度為1的結點個數
統計二叉樹中度為2的結點個數
int
finddu2
(bitree t)
else
return0;
}
求中序遍歷序列的第乙個結點值bilnode*
zhong
(bitree t)
輸出二叉樹void
print
(linklist l)
cout<}
用括號法輸出二叉樹void
print
(bitree t)
print
(t->rchild)
; cout<<
")";}}
}
二叉樹的按值查詢bilnode *
findnode
(bitree t,
char x)
if(t-
>rchild!=
null)}
return
null
;}
二叉鍊錶查詢其雙親及左右孩子值void
find
(bitree &t,
char k)
find
(t->lchild,t-
>data)
;find
(t->rchild,t-
>data);}
}
二叉樹的刪除以值x為根結點的子樹void
find
(bitree &t,
char x)
}}
任何一顆和樹對應的二叉樹,其根結點的右子樹必空。
見書p135。
森林轉換成二叉樹
二叉樹轉換成森林
哈夫曼樹又稱最優樹。
在哈夫曼樹中,任何乙個結點它的度都是0或2。
哈夫曼樹的結點個數不能是偶數。
哈夫曼編碼是最優字首編碼。
哈夫曼樹的根結點的權值等於各個葉子結點的權值之和。
當一棵具有n個葉子結點的二叉樹的wpl值為最小時,稱其樹為哈夫曼樹,其二叉樹的形狀是唯一的。
哈夫曼樹是帶權路徑長度最短的樹,路徑上權值較大的結點離根較近。
資料結構與演算法期末複習題
在帶有頭結點的單鏈表hl中,要向表頭插入乙個由指標p指向的結點,則執行 a a.p next hl next hl next p b.p next hl hl p c.p next hl p hl d.hl p p next hl 乙個棧的輸入序列為1 2 3,則下列序列中不可能是棧的輸出序列的是 ...
資料結構期末複習
1 基於鄰接表 2struct vertexnode3 7struct edgenode8 12struct vertexnode adjlist 100 13 int visited 100 14 void gs int a,int n,int e 15 22for k 0 k e k 2330 ...
資料結構期末複習(一)
一.判斷題 字串是資料物件特定的線性表 t 乙個無向圖的連通分量是其極大的連通子圖 t 解析位址 假設b是一棵樹,b 是對應的二叉樹。則b的後根遍歷相當於b 的中序遍歷 t 通常,二叉樹的第i層上有2i 1個結點 f 對於一棵m階的b 樹,樹中每個結點至多有m 個關鍵字。除根之外的所有非終端結點至少...