二叉樹的基礎知識

二叉樹:

1.      定義:二叉樹是一個連通的無環圖,並且每一個頂點的度不大於3。有根二叉樹還要滿足根結點的度不大於2。有了根結點之後,每個頂點定義了唯一的父結點,和最多2個子結點。然而,沒有足夠的信息來區分左結點和右結點。如果不考慮連通性,允許圖中有多個連通分量,這樣的結構叫做森林。

2.      基本概念:

二叉樹是遞歸定義的,其結點有左右子樹之分,邏輯上二叉樹的結點有五種基本形態:

(1)空二叉樹——如圖(a);

(2)只有一個根結點的二叉樹——如圖(b);

(3)只有左子樹——如圖(c);

(4)只有右子樹——如圖(d);

(5)完全二叉樹——如圖(e)。

3.      二叉樹類型:

(1)完全二叉樹——若設二叉樹的高度爲h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層有葉子結點,並且葉子結點都是從左到右依次排布,這就是完全二叉樹

(2)滿二叉樹——除了葉結點外每一個結點都有左右子葉且葉子結點都處在最底層的二叉樹。

(3)平衡二叉樹——平衡二叉樹又被稱爲AVL樹(區別於AVL算法),它是一棵二叉排序樹,且具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。

4.      相關術語:

樹的結點:包含一個數據元素及若干指向子樹的分支;

孩子結點:結點的子樹的根稱爲該結點的孩子;

雙親結點:B 結點是A 結點的孩子,則A結點是B 結點的雙親;

兄弟結點:同一雙親的孩子結點;堂兄結點:同一層上結點;

祖先結點: 從根到該結點的所經分支上的所有結點

子孫結點:以某結點爲根的子樹中任一結點都稱爲該結點的子孫

結點層:根結點的層定義爲1;根的孩子爲第二層結點,依此類推;

樹的深度:樹中最大的結點層

結點的度:結點子樹的個數

樹的度: 樹中最大的結點度。

葉子結點:也叫終端結點,是度爲 0 的結點;

分枝結點:度不爲0的結點;

有序樹:子樹有序的樹,如:家族樹;

無序樹:不考慮子樹的順序;

5.      二叉樹性質:

(1) 在非空二叉樹中,第i層的結點總數不超過 , i>=1;

(2) 深度爲h的二叉樹最多有 個結點(h>=1),最少有h個結點;

(3) 對於任意一棵二叉樹,如果其葉結點數爲N0,而度數爲2的結點總數爲N2,則N0=N2+1;

(4) 具有n個結點的完全二叉樹的深度爲

(5)有N個結點的完全二叉樹各結點如果用順序方式存儲,則結點之間有如下關係:若I爲結點編號則如果I>1,則其父結點的編號爲I/2;如果2*I<=N,則其左兒子(即左子樹的根結點)的編號爲2*I;若2*I>N,則無左兒子;如果2*I+1<=N,則其右兒子的結點編號爲2*I+1;若2*I+1>N,則無右兒子。

(6)給定N個節點,能構成h(N)種不同的二叉樹。h(N)爲卡特蘭數的第N項。h(n)=C(2*n,n)/(n+1)。

(7)設有i個枝點,I爲所有枝點的道路長度總和,J爲葉的道路長度總和J=I+2i[4] 

6.      二叉樹存儲結構:

(1)  順序存儲方式

(2)  鏈表存儲方式

7.      二叉樹與樹的區別:

二叉樹不是樹的一種特殊情形,儘管其與樹有許多相似之處,但樹和二 叉樹有兩個主要差別:

1. 樹中結點的最大度數沒有限制,而二叉樹結點的最大度數爲2;

2. 樹的結點無左、右之分,而二叉樹的結點有左、右之分。

8.      遍歷順序:

遍歷是對樹的一種最基本的運算,所謂遍歷二叉樹,就是按一定的規則和順序走遍二叉樹的所有結點,使每一個結點都被訪問一次,而且只被訪問一次。由於二叉樹是非線性結構,因此,樹的遍歷實質上是將二叉樹的各個結點轉換成爲一個線性序列來表示。設L、D、R分別表示遍歷左子樹、訪問根結點和遍歷右子樹,則對一棵二叉樹的遍歷有三種情況:N(Node)、L(Left subtree)和R(Right subtree)

NLR(稱爲先根次序遍歷)(先序遍歷)Preorder Traversal

LNR(稱爲中根次序遍歷)(中序遍歷)Inorder Traversal

LRN(稱爲後根次序遍歷)(後序遍歷)Postorder Traversal

層序遍歷:除了先序遍歷、中序遍歷、後序遍歷外,還可以對二叉樹進行層序遍歷。設二叉樹的根節點所在層數爲1,層序遍歷就是從所在二叉樹的根節點出發,首先訪問第一層的樹根節點,然後從左到右訪問第2層上的節點,接着是第三層的節點,以此類推,自上而下,自左至右逐層訪問樹的結點的過程就是層序遍歷。通常用隊列來做。訪問根,訪問子女,再訪問子女的子女(越往後的層次越低)(兩個子女的級別相同)

線索二叉樹:

線索二叉樹(保留遍歷時結點在任一序列的前驅和後繼的信息):若結點有左子樹,則其lchild域指示其左孩子,否則令lchild域指示其前驅;若結點有右子樹,則其rchild域指示其右孩子,否則令rchild指示其後繼。還需在結點結構中增加兩個標誌域LTag和RTag。LTag=0時,lchild域指示結點的左孩子,LTag=1時,lchild域指示結點的前驅;RTag=0時,rchild域指示結點的右孩子,RTag=1時,rchild域指示結點的後繼。以這種結點結構構成的二叉線索鏈表,鏈表作爲二叉樹的存儲結構,叫做其中指向結點前驅和後繼的指針,加上線索的二叉樹稱爲線索二叉樹。對二叉樹以某種次序遍歷使其變爲線索二叉樹的過程叫做線索化。若對二叉樹進行中序遍歷,則所得的線索二叉樹稱爲中序線索二叉樹,線索鏈表稱爲爲中序線索鏈表。線索二叉樹是一種物理結構

在中序線索樹找結點後繼的規律是:若其右標誌爲1,則右鏈爲線索,指示其後繼,否則遍歷其右子樹時訪問的第一個結點(右子樹最左下的結點)爲其後繼;找結點前驅的規律是:若其左標誌爲1,則左鏈爲線索,指示其前驅,否則遍歷左子樹時最後訪問的一個結點(左子樹中最右下的結點)爲其前驅。

在後序線索樹中找到結點的後繼分三種情況:

若結點是二叉樹的根,則其後繼爲空;若結點是其雙親的右孩子,或是其雙親的左孩子且其雙親沒有右子樹,則其後繼即爲雙親結點;若結點是其雙親的左孩子,且其雙親有右子樹,則其後繼爲雙親右子樹上按後序遍歷列出的第一個結點。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章