資料結構之樹和二叉樹
樹型結構是一類重要的非線性資料結構,樹是以分支關係定義的層次結構。
樹(Tree)
樹是n(n>=0)個結點的有限集。
在任意一棵非空樹中:
(1)有且僅有一個特定的根結點(Root)
(2)當n>1時,其餘節點可分為m(m>0)個互不相交的有限集,其中每一個集合本身又是一棵樹,並且稱為根的子樹(SubTree)
一些相關的基本術語:
(1)度(Degree):結點擁有的子樹數稱為結點的度。例如上圖中A的度為3,C的度為1,F的度為0
(2)葉子(Leaf)或終端結點:度為0的結點。上圖中的葉子結點有K,L,F,G,M,I,J
(3)樹的度:樹內各節點的度的最大值。上圖中樹的度為3
(4)孩子(Child):結點的子樹的根,相應的,該節點稱為孩子的雙親(Parent)。
(5)兄弟(Sibling):同一個雙親的孩子互稱為兄弟。上圖中的H,I,J互為兄弟。
(6)祖先:從根結點到該結點所經分支上的所有結點。例如M的祖先為A,D,H。反之,以某結點為根的子樹中的任一結點都稱為該結點的子孫。
(7)層次(Level):從根開始定義,根為第一層,根的孩子為第二層。
(8)堂兄弟:雙親在同一層的結點。例如上圖中的F,G
(9)樹的深度(Depth)或高度:樹中結點的最大層次稱為樹的深度。上圖中樹的深度為4
(10)森林(Forest):是m(m>=0)棵互不相交的樹的集合。
二叉樹(Binary Tree)
二叉樹是另一種樹型結構,它的特點是每個節點至多隻有兩棵子樹(即二叉樹中不存在度大於2的結點)。
二叉樹的子樹有左右之分,其次序不能任意顛倒。
二叉樹的性質:
(1)在二叉樹的第i層上,至多有個結點(i>=1)
(2)深度為k的二叉樹至多有個結點(k>=1)
(3)對任何一棵二叉樹T,如果其葉子結點樹為,度為2的結點數為,則=+1
(4)具有n個結點的完全二叉樹的深度為+1
(5)一棵有n個結點的完全二叉樹的結點按層序編號,則對任一結點有:
(a)如果i=1,則結點i是二叉樹的根,無雙親;若i>1,則其雙親是結點
(b)如果2i>n,則結點i無左孩子(結點i為葉子結點);否則其左孩子為結點2i
(c)如果2i+1>n,則結點i無右孩子;否則其右孩子為結點2i+1
遍歷二叉樹(Traversing Binary Tree)
遍歷二叉樹即如何按某條搜尋路徑巡訪樹中每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。
已知二叉樹是由3個基本單元組成的:根結點,左子樹,右子樹。
假如以L,D,R分別表示遍歷左子樹,訪問根結點和遍歷右子樹,若限定先左後右,則有3種情況:先序遍歷、中序遍歷、後序遍歷
如上圖的二叉樹,其先序遍歷結果為:ABDEHIJKCFG,中序遍歷結果為:DBHEJIKAFCG,後序遍歷結果為:DHJKIEBFGCA
線索二叉樹(Threaded Binary Tree)
二叉連結串列作為儲存結構時只能找到結點的左,又孩子資訊,而不能直接得到結點在任一序列中的前驅和後繼資訊。為了儲存這種資訊,可以在二叉樹節點上增加兩個標誌域。
其中:
指向結點前驅和後繼的指標稱為線索,加上線索的二叉樹稱之為線索二叉樹。
對二叉樹以某種次序遍歷使其變為線索二叉樹的過程叫做線索化。
上圖中的二叉樹可以修改為以下線索連結串列:
二叉排序樹(Binary Sort Tree)/二叉搜尋樹(Binary Search Tree,BST)/二叉查詢樹
二叉排序樹或者是一棵空樹,或者是具有以下性質的二叉樹:
(1)若它的左子樹不為空,則左子樹上所有結點的值均小於它的根結點的值
(2)若它的右子樹不為空,則右子樹上所有結點的值均大於它的根結點的值
(3)它的左右子樹也分別為二叉排序樹
下圖為一棵二叉排序樹:
平衡二叉樹(Balanced Binary Tree 或 Height-Balanced Tree)
平衡二叉樹又稱為AVL樹。它或者為一棵空樹,或者是具有以下性質的二叉樹:它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的深度之差的絕對值不超過1。
若將二叉樹上結點的平衡因子BF(Balance Factor)定義為該結點的左子樹的深度減去它的右子樹的深度,則平衡二叉樹上所有結點的平衡因子只可能是-1,0,1.
只要二叉樹上有一個結點的平衡因子的絕對值大於1,則該二叉樹就是不平衡的。
完全二叉樹(Complete Binary Tree)
若二叉樹的深度為h,除第h層外,其他各層(1~h-1)的結點都達到最大個數,第h層所有的結點都連續集中在最左邊,這就是完全二叉樹。
假設是度為0的結點(葉子結點)總數,是度為1的結點總數,是度為2的結點總數,則這樣的完全二叉樹有如下性質:
(1)n=++
(2)n=1++2*
(3)=
以下為一棵完全二叉樹:
滿二叉樹(Full Binary Tree)
如果一棵二叉樹的結點要麼是葉子結點,要麼有兩個子結點,這樣的樹就是滿二叉樹。即一棵滿二叉樹的層數為k,且結點總數是-1.
下圖為一棵滿二叉樹: