數據結構: 樹和堆

樹的基本概念

爲了完整的建立有關樹的基本概念,以下給出兩種樹的定義,即自由樹和有根

術語

節點的度:一個節點含有的子樹的個數稱爲該節點的度;
樹的度:一棵樹中,最大的節點的度稱爲樹的度;
葉節點或終端節點:度爲零的節點;
非終端節點或分支節點:度不爲零的節點;
雙親節點或父節點:若一個結點含有子節點,則這個節點稱爲其子節點的父節點;
孩子節點或子節點:一個節點含有的子樹的根節點稱爲該節點的子節點;
兄弟節點:具有相同父節點的節點互稱爲兄弟節點;
節點的層次:從根開始定義起,根爲第1層,根的子節點爲第2層,以此類推;
樹的高度或深度:樹中節點的最大層次;
堂兄弟節點:雙親在同一層的節點互爲堂兄弟;
節點的祖先:從根到該節點所經分支上的所有節點;
子孫:以某節點爲根的子樹中任一節點都稱爲該節點的子孫。
森林:由m(m>=0)棵互不相交的樹的集合稱爲森林;

 

二叉樹

二叉樹是樹形結構的一個重要類型。許多實際問題抽象出來的數據結構往往是二叉樹的形式,即使是一般的樹也能簡單地轉換爲二叉樹,而且二叉樹的存儲結構及其算法都較爲簡單,因此二叉樹顯得特別重要。
二叉樹(BinaryTree)是n(n≥0)個結點的有限集,它或者是空集(n=0),或者由一個根結點及兩棵互不相交的、分別稱作這個根的左子樹和右子樹的二叉樹組成。
這個定義是遞歸的。由於左、右子樹也是二叉樹, 因此子樹也可爲空樹。

二叉樹的性質:

性質1 二叉樹第i層上的結點數目最多爲2^i-1(i≥1)

性質2 深度爲k的二叉樹至多有2^k-1個結點(k≥1)

性質3 在任意-棵二叉樹中,若葉子結點(即度爲0的結點)的個數爲n0,度爲1的結點數爲n1,度爲2的結點數爲n2,則no=n2+1。

滿二叉樹(FullBinaryTree) 

     一棵深度爲k且有2^k-1個結點的二又樹稱爲滿二叉樹。

滿二叉樹的特點:

  (1)每一層上的結點數都達到最大值。即對給定的高度,它是具有最多結點數的二叉樹。

  (2)滿二叉樹中不存在度數爲1的結點,每個分支結點均有兩棵高度相同的子樹,且樹葉都在最下一層上。

若一棵二叉樹至多隻有最下面的兩層上結點的度數可以小於2,並且最下一層上的結點都集中在該層最左邊的若干位置上,則此二叉樹稱爲完全二叉樹。
  特點:
  (1)滿二叉樹是完全二叉樹,完全二叉樹不一定是滿二叉樹。
  (2)在滿二叉樹的最下一層上,從最右邊開始連續刪去若干結點後得到的二叉樹仍然是一棵完全二叉樹。
  (3)在完全二叉樹中,若某個結點沒有左孩子,則它一定沒有右孩子,即該結點必是葉結點。

 

二叉樹遍歷及其應用

二叉樹遍歷(Binary Tree Traversal)就是遵從某種次序,遍訪二叉樹中的所有結點,使得每個結點被訪問一次,而且只訪問一次。這裏,“訪問”的意思就是對結點實施某些操作。

令L,R,V分別代表遍歷一個結點的左子樹、右子樹、和訪問該結點的操作,則遍歷二叉樹有6種規則:

VLR,LVR,LRV,VRL,RVL,RLV

若規定先左後右,則僅剩下前面三種,即:VLR(前序遍歷),LVR(中序遍歷),LRV(後序遍歷)

數據集合如果有序,將爲各種操作帶來便利。但是有些應用並不要求數據全部有序,或者在操作開始前就完全有序。在許多應用中,通常需要先收集一部分數據,從中挑選具有最小或最大關鍵碼的記錄開始處理,接着,可能會收集更多數據,並處理當前數據集具有最大或最小關鍵碼的記錄。對於這類應用,我們期望的數據結構應能支持插入操作,並能方便地從中取出具有最大或最小關鍵碼的記錄,這樣的數據結構即爲優先級隊列(priority queue)。從外表看來,優先級隊列頗似隊列和棧,但要構建高效率的優先級隊列,需要比實現隊列和棧考慮更多的因素。在優先級隊列的各種實現中,堆(heap)是最高效的一種數據結構。

最小堆和最大堆

假定在各個數據記錄中存在一個能夠標識數據記錄的數據項,並將依據該數據項對數據進行組織,則可稱這些數據項爲關鍵碼(key)。

如果有一個關鍵碼的集合K={k0,k1,k2,k3,...,kn-1},把它的所有元素按完全二叉樹的順序存儲方式存放在一個一維數組中,並且滿足

k_i <= k_2i+1且k_i <= k_2i+2(或k_i >= k_2i+1且k_i >= k_2i+2)  i=0,1,...,[(n-2)/2]

則稱這個集合爲最小堆(或最大堆)。

下圖給出了最小堆和最大堆的例子。前者任一結點的關鍵碼均小於或等於它的左、右子女的關鍵碼,位於堆頂的結點是整個集合中最小的,所以稱它爲最小堆。

 

本文地址:http://blog.csdn.net/linj_m/article/details/17587565

參考文獻:

[1] 殷人昆. 數據結構 (用面向對象方法與 C++ 語言描述)[M]. 2007.

[2] Cormen T H, Leizerson C E, Rivest R L. 算法導論[M]. 2006.

[3] 維基百科

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