本博文意在鞏固基礎知識,高手請繞過。部分**和內容參考嚴蔚敏人民郵電版出版社《資料結構》
樹和二叉樹
樹樹(tree)
是n(n≥0)
個結點的有限集
t,在任意一棵非空樹中:
有且僅有乙個特定的結點,稱為樹的根(root),
當n>1
時,其餘結點可分為
m(m>0)
個互不相交的有限集
t1,t2,……tm,其中每乙個集合本身又是一棵樹,稱為根的子樹
樹的特點:
非空樹中至少有乙個結點 —— 根
樹中各子樹是互不相交的集合
樹的基本術語:
結點(node)——表示樹中的元素,包括資料項及若干指向其子樹的分支
結點的度(degree)——結點擁有的子樹數
葉子(leaf)——度為0的結點
雙親(parents)——孩子結點的上層結點叫該結點的雙親
兄弟(sibling)——同一雙親的孩子
樹的度——一棵樹中最大的結點度數
結點的層次(level)——從根結點算起,根為第一層,它的孩子為第二層……
深度(depth)——樹中結點的最大層次數
森林(forest)——m(m³0)棵互不相交的樹的集合
二叉樹二叉樹是一種特殊的樹
定義:二叉樹是n(n³0)個結點的有限集,它或為空樹
(n=0)
,或由乙個根結點和兩棵分別稱為左子樹和右子樹的互不相交的二叉樹構成
特點:
每個結點至多有2
棵子樹(
即不存在度大於
2的結點);
二叉樹的子樹有左、右之分,且其次序不能任意顛倒。
二叉樹的5
種基本形態:
空二叉樹
只有根結點的二叉樹
右子樹為空
左子樹為空
左、右子樹均非空
二叉樹性質
性質1:在非空二叉樹中,第i
層上至多有2i-1個結點(i≧1)
性質2:深度為k的二叉樹至多有2k-1個結點(k≧1)
性質3:對任何一棵二叉樹,若其葉子結點數為n0,度為2的結點數為n2,則n0=n2+1
性質4:n個結點的完全二叉樹深度為:ë㏒2nû +1。
其中符號: ëxû表示不大於x的最大整數。éxù 表示不小於x的最小整數。
性質5:若對一棵有n
個結點的完全二叉樹
(深度為└㏒2n┘+1)
的結點按層(從第1層到第ë㏒2nû +1層
)序自左至右進行編號
,則對於編號為i(1≦i≦n)的結點:
⑴ 若i=1:則結點i是二叉樹的根,無雙親結點;否則,若i>1,則其雙親結點編號是 ëi/2û 。
⑵ 如果2i>n:則結點i為葉子結點,無左孩子;否則,其左孩子結點編號是2i。
⑶ 如果2i+1>n:則結點i無右孩子;否則,其右孩子結點編號是2i+1。
滿二叉樹
一棵深度為k且有2k-1個結點的二叉樹稱為滿二叉樹。
完全二叉樹
如果深度為k,由n個結點的二叉樹,當且僅當其每乙個結點都與深度為k的滿二叉樹中編號從1到n的結點一一對應,該二叉樹稱為完全二叉樹。或深度為k的滿二叉樹中編號從1到n的前n個結點構成了一棵深度為k的完全二叉樹。
遍歷二叉樹
三種遍歷方式
1.dlr——先(根)
序遍歷。
2.ldr——中(根)
序遍歷。
3.lrd——後(根)
序遍歷。
如下圖所示的二叉樹表示表示式:(a+b*(c-d)-e/f)
按不同的次序遍歷此二叉樹,將訪問的結點按先後次序排列起來的次序是:
其先序序列為: -+a*b-cd/ef
其中序序列為: a+b*c-d-e/f
其後序序列為: abcd-*+ef/-
樹的遍歷
樹的遍歷可以先轉化為二叉樹,然後進行遍歷。
樹的遍歷有三種:
1.先根(序)
遍歷:若樹不空,則先訪問根結點,然後依次先根遍歷各棵子樹。
2.後根(序)
遍歷:若樹不空,則先依次後根遍歷各棵子樹,然後訪問根結點。
3.按層次遍歷:若樹不空,則自上而下自左至右訪問樹中每個結點。
森林的遍歷有兩種:
1.先序遍歷(
對森林中的每一棵樹進行先根遍歷
)若森林不空,則訪問森林中第一棵樹的根結點;
先序遍歷森林中第一棵樹的子樹森林;
先序遍歷森林中(
除第一棵樹之外
)其餘樹構成的森林。
2.中序遍歷(
對森林中的每一棵樹進行後根遍歷
)若森林不空,則中序遍歷森林中第一棵樹的子樹森林;
訪問森林中第一棵樹的根結點;
中序遍歷森林中(
除第一棵樹之外
)其餘樹構成的森林。
哈夫曼樹
假設n個權值(w1…… wn),試構造一棵有n
個葉子結點的二叉樹,每個葉子結點權是
wi,則其中帶權路徑長度
wpl最小的二叉樹稱作最優二叉樹,也稱為哈夫曼樹。
一般情況下,最優二叉樹中,權值越大的葉子離根越近。
構造哈夫曼樹的方法 ——哈夫曼演算法
假設有n
個權值分別為
w1,w2,…,wn, 則構造出的哈夫曼樹有
n個葉子結點。
n個權值則哈夫曼樹的構造規則為:
(1) 將這
n個結點看作是
n 棵單結點二叉樹,結點的權值分別是
w1, w2, …, wn ;這
n棵二叉樹構成乙個二叉樹的集合m。
(2) 在集合
m中選出兩個根結點的權值最小的二叉樹合併,作為一棵新樹的左、右子樹,且新樹的根結點權值為其左、右子樹根結點權值之和;
(3) 從集合
m中刪除選取的兩棵二叉樹,並將新樹加入該集合
(4) 重複
(2)、
(3)步,直到集合
m中只剩一棵二叉樹為止,該二叉樹即為我們所求得的哈夫曼樹。
哈夫曼編碼方法
以字符集c作為葉子結點,次數或頻度集w作為結點的權值來構造哈夫曼樹。規定哈夫曼樹中左分支代表「0」,右分支代表「1」 。
從根結點到每個葉子結點所經歷的路徑分支上的「0」或「1」所組成的字串,為該結點所對應的編碼,稱之為哈夫曼編碼。
資料結構學習心得(一)
計算機現在不在侷限於數字計算,更多應用於控制,管理及資料處理等非數值計算領域。這裡面涉及到兩個問題 資訊的表示,資訊的處理。分析待處理問題中的物件的特徵及個物件之間存在的關係,這既是資料結構這門課索要研究的問題。編寫解決實際問題的程式的一般過程 如何用資料形式描述問題?即由問題抽象出乙個適當的數學模...
資料結構學習心得總結
學習完成後,受益良多,也非常喜悅,非常開心,好像終於打了一場勝仗一樣!我打算將這乙個月的學習心得做乙個彙總,記錄下來。希望能給初學者帶來信心和經驗,能給大家分享這份快樂 剛開始打算學資料結構,是因為找工作面試的時候,很多公司都要求對資料結構有了解。沒辦法,我只有硬著頭皮學了。但是我沒有任何學習思路,...
c語言資料結構學習心得 棧
棧 stack 只允許在一端進行插入或刪除操作的線性表 棧頂 top 棧中允許進行插入和刪除操作的那一端 棧底 bottom 固定的,不允許進行插入或刪除的另一端 1.棧是受限的線性表,所以自然具有線性關係。2.棧中元素後進先出。棧的順序儲存 順序棧 define maxsize 50 定義棧中元素...