二叉查找樹和二叉堆


A. 二叉查找樹(Binary Search Tree),又稱為有序二叉樹,排序二叉樹,滿足以下性質:

1)沒有鍵值相等的節點。

2)若左子樹不為空,左子樹上節點值均小於根節點的值。

3)若右子樹不為空,右子樹上節點值均大於根節點的值。

  二叉查找樹中對於目標節點的查找過程類似與有序數組的二分查找,並且查找次數不會超過樹的深度。設節點數目為n,樹的深度為h,假設樹的每層都被塞滿(第L層有2^L個節點,層數從1開始),則根據等比數列公式可得h=log(n+1)。即最好的情況下,二叉查找樹的查找效率為O(log n)。當二叉查找樹退化為單鏈表時,比如,只有右子樹的情況,如下圖所示,此時查找效率為O(n)。

  總之,二叉查找樹越是“矮胖”,也就是每層盡可能地被“塞滿”(每個父節點均有兩個子節點)時,查找效率越高。每層都被塞滿時,查找效率最高,最高為O(log n)。當二叉查找樹退化為單鏈表時,查找效率最低,最低為O(n)。

B. 為了解決二叉查找樹退化為單鏈表時查找效率低下的問題,引入了平衡二叉樹(AVL,人名)。平衡二叉樹的性質如下:

  1)父節點的左右兩棵子樹的深度之差的絕對值不超過1。

  從平衡二叉樹的性質可知,平衡二叉樹就是避免了二叉查找樹退化為單鏈表的極端情況。二叉查找樹的查找、插入、刪除較好時間復雜度是O(log n),最差是O(n)。二叉平衡樹保證查找、插入、刪除的時間復雜度穩定在O(log n)下。

C. 二叉樹的一個應用是堆。介紹堆之前,首先需要了解完全二叉樹和滿二叉樹。

1)滿二叉樹:二叉樹的第i層節點數量為2^(i-1),則稱此二叉樹為滿二叉樹。

2)完全二叉樹:設二叉樹深度為h,前(h-1)層均被填滿(每個父節點均有兩個子節點),第h層從左至右,只有最右側子樹未被填滿,則稱此樹為完全二叉樹。

D. 堆通常可以看作為一棵樹。這里的堆是數據結構中的堆而非內存模型中的堆。堆有兩個形式:

1)堆中任意節點的值不大於(小於)其子節點的值。    不大於---最小堆   不小於---最大堆

2)堆是一棵完全樹。

  二叉堆由一棵完全二叉樹組成。堆的實現一般為數組形式。對於下標為i的節點,其父節點下標為floor((i-1)/2)(向下取整),左節點是2*i+1,右節點是2*i+2。一個最小二叉堆以及其數組實現如下所示。

  將堆頂節點存儲到數組第一個位置,然后根據公式,計算其左右節點的存儲位置,依此類推。數組最后一個元素必是葉子節點。 

  最小二叉堆插入(入隊):從完全二叉樹的最后一層上,最右側的子樹開始,依據堆的第1個性質,通過不斷向上向下調整插入元素的位置完成插入。初始狀態下,在數組末尾加入待插入元素,在調整插入元素位置時,在數組中交換相關元素來體現。向上述最小二叉堆插入元素2的過程如下。

  最小二叉堆的刪除(出隊):出隊一定是刪除堆結構中堆頂節點,也就是數組中第1個元素。出隊時,將最右側子樹的最右側節點(也就是數組中的最后一個元素)A移至堆頂節點,通過不斷的向上、向下調整A的位置完成堆頂節點的刪除。刪除上述最小二叉堆的堆頂節點的過程如下。

  可以使用堆實現優先隊列和“堆排序”。堆的查找、插入、刪除都穩定在O(log n),因為堆是一棵完全樹,不會退化為單鏈表。

 

  二叉查找樹是為了實現動態查找而設計的數據結構,它是面向查找操作的,在二叉排序樹中查找一個結點的平均時間復雜度是O(log n);
  堆是為了實現排序而設計的一種數據結構,它不是面向查找操作的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM