序
數據結構分爲:邏輯結構、存儲結構。
邏輯結構分爲:集合、線性結構、樹形結構、圖形結構。
--線性表、棧、隊列、樹、圖等邏輯結構。
--其中線性表、棧、隊列爲線性結構,樹和圖都是非線性結構。
物理存儲結構分爲:順序存儲結構、鏈式存儲結構,索引結構,哈希結構。
邏輯結構可以採用兩種方法來描述:二元組、圖形。
--二元組表示形式: DS = ( D, S ) 【Data Structure】
--其中 D 是數據元素的集合; S 是 D 中數據元素之間的關係集合,並且數據元素之間的關係是使用序偶來表示的。序偶是由兩個元素 x 和 y 按一定順序排列而成的二元組,記作<x , y>, x 是它的第一元素, y 是它的第二元素。
樹是什麼?
線性結構是一對一的關係,樹是一對多的關係這一點看似簡單實際至關重要在以後某些問題的推導中會頻繁使用,圖是多對多的關係。而樹就是像下面這樣的每個元素這裏我們叫做結點,每個結點有一個雙親結點(這個結點的上層結點)可以叫做入度(對於樹來講入度恆爲1),n個孩子結點(這個結點的下層結點)叫n叫做出度,對於樹來講直接叫做度。
樹的基本概念
結點(node)—表示樹中的元素,包括數據項及若干指向其子樹的分支
結點的度(degree of a node)—結點擁有的子樹個數
葉子(leaf)—度爲0的結點
樹的度(degree of a tree)— 一棵樹中最大的結點度數(子樹數)
孩子(Children)—結點的子樹的根稱爲
該結點的孩子(結點)
雙親(parent)—孩子結點的上一層結點
叫該結點的~(父結點)
兄弟(siblings)——同一雙親的孩子互稱兄弟(結點)
結點的層次(level of a node)——從根結點算起,根爲第一層,它的孩子爲第二層……
樹的深度(樹高, height /depth of a tree )—樹中結點的最大層次數
堂兄弟--其雙親在同一層的結點互稱爲堂兄弟。
結點的祖先(ancestors of a node )—從根結點到該結點所經分支上的所有結點
結點的子孫(descendants of a node)—以某結點爲根的子樹中的任一結點都稱之爲該結點的子孫
有序樹和無序樹:樹中各結點的子樹
從左到右有次序(不能互換),
稱該樹爲有序樹,否則爲無序樹。
(有序樹:第一個孩子、第二個孩子…)
森林(Forest)—m(m³0)棵互不相交的樹構成的集合
樹與森林
森林是n棵互不相交的樹構成的集合,每一棵樹如果去掉根節點就會是n棵新的樹,我們稱之爲子樹,而子樹也是有根節點的,再去掉子樹的根節點又是n棵子樹的子樹,於是就是這樣子子孫孫無窮匱也的嵌套下去。因此在樹中遞歸算法是至關重要的,樹和森林在某種意義上是可以相互轉化的。
就邏輯結構而言,可以森林和樹相互遞歸的定義來描述樹:
任何一棵非空樹是一個二元組
Tree = (root,F)
其中:root 被稱爲根結點
F 被稱爲子樹森林
二叉樹
二叉樹就是度 ≤ 2的樹,由於我們直接研究樹,難度太大無法等到有效的結論,因此,我們先研究一種最簡單的,應用廣泛的樹。直接來看二叉樹的性質這些性質是至關重要的。
二叉樹的性質:
- 在二叉樹的第 i 層上至多有2i-1 個結點。(i≥1)
- 深度爲 k 的二叉樹上至多含 2k-1 個結點(k≥1)
- 對任何一棵二叉樹,若它含有n0 個葉子結點、n2 個度爲 2 的結點,則必存在關係式:n0 = n2+1。
- 具有 n 個結點的完全二叉樹的深度爲: log2n +1
- 對完全二叉樹中任意一個編號爲 i 的結點:
- 若對含 n 個結點的完全二叉樹從上到下且從左至右進行 1 至 n 的編號,則若 i=1,則該結點是二叉樹的根,無雙親;否則,編號爲 ëi/2û 的結點爲其雙親結點
- 若 2i>n,則該結點無左孩子, 否則,編號爲 2i 的結點爲其左孩子結點
- 若 2i+1>n,則該結點無右孩子結點,否則,編號爲2i+1 的結點爲其右孩子結點
性質的直接運用
eg:
一棵深度爲k的正則二叉樹(沒有度爲1的結點的二叉樹)至少有( 2k-1 )個結點。
一棵含有11個頂點的正則二叉樹的最大深度可以是( 6 ),最小深度可以是( 4 )。
一棵深度爲k的滿二叉樹的葉子有( 2^(k-1) )個。
一棵深度爲k的完全二叉樹的結點至多有( (2的k次方)-1 )個,至少有( 2的(k-1)次方 )個。
有n個葉子的哈夫曼樹的結點總數爲( 2n-1 )個。
表達式的轉換
eg:算術表達式A+B*(C+D/E)轉爲後綴表達式後爲(-+A*BC/DE)。
利用表達式樹
給定一個表達式的中綴形式:(4+1*(5-2))-6/3
首先將每個運算加上括號,區分優先級,得到(4+(1*(5-2)))-(6/3)
括號外的-優先級最低,作爲根節點,(4+(1*(5-2)))作爲左子樹,(6/3)作爲右子樹;
遞歸的轉換4+(1*(5-2)),+最爲根節點,4是左子樹,(1*(5-2))是右子樹。*是右子樹的根節點,1是左子樹,(5-2)是右子樹。最後計算(5-2),-是根節點,5是左子樹,2是右子樹。得到的表達式樹如文章之初給出的圖。
構造好表達式樹之後,前綴表達式和中綴表達式可根據先根遍歷和後根遍歷得到。
前綴表達式:- + 4 * 1 - 5 2 / 6 3
後綴表達式:4 1 5 2 - * + 6 3 / -
當然也可以使用棧來實現
二叉樹/樹的遍歷
eg:根據先根序、中根序遍歷寫出後根序遍歷序列。
先根序遍歷序列:ABDGECFH
中根序遍歷序列:DGBEACHF
後根序遍歷序列:GDEBHFCA
哈夫曼樹
又稱最優二叉樹,它是n個帶權葉子結點構成的所有二叉樹中,帶權路徑長度WPL最小的二叉樹。
對於哈夫曼樹最重要的就是學會如何構造,一道例題來講明白
eg:假設用於通信的電文由7個字母組成{A,B,C,D,E,F,G},字母在電文中出現的頻率分別爲0.17、0.09、0.12、0.06、0.32、0.03、0.21。試爲這7個字母設計哈夫曼編碼,並計算其帶權路徑長度WPL。
哈夫曼編碼爲:
A:101
B:001
C:100
D:0001
E:11
F:0000
G:01
帶權路徑長度WPL=(0.03+0.06)*4+(0.09+0.12+0.17)*3+(0.21+0.32)*2=2.56
樹的儲存結構和遍歷請看下一篇博文