1. 程式人生 > >資料結構之樹和二叉樹

資料結構之樹和二叉樹

樹型結構是一類重要的非線性資料結構,樹是以分支關係定義的層次結構。

樹(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層上,至多有2^{i-1}個結點(i>=1)

(2)深度為k的二叉樹至多有2^{k}-1個結點(k>=1)

(3)對任何一棵二叉樹T,如果其葉子結點樹為n_{0},度為2的結點數為n_{2},則n_{0}=n_{2}+1

(4)具有n個結點的完全二叉樹的深度為\left \lfloor log_{2}n \right \rfloor+1

(5)一棵有n個結點的完全二叉樹的結點按層序編號,則對任一結點有:

(a)如果i=1,則結點i是二叉樹的根,無雙親;若i>1,則其雙親是結點\left \lfloor i/2 \right \rfloor

(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層所有的結點都連續集中在最左邊,這就是完全二叉樹。

假設n_{0}是度為0的結點(葉子結點)總數,n_{1}是度為1的結點總數,n_{2}是度為2的結點總數,則這樣的完全二叉樹有如下性質:

(1)n=n_{0}+n_{1}+n_{2}

(2)n=1+n_{1}+2*n_{2}

(3)n_{0}=\left \lceil n/2 \right \rceil

以下為一棵完全二叉樹:

滿二叉樹(Full Binary Tree)

如果一棵二叉樹的結點要麼是葉子結點,要麼有兩個子結點,這樣的樹就是滿二叉樹。即一棵滿二叉樹的層數為k,且結點總數是2^{k}-1.

下圖為一棵滿二叉樹: