平衡樹和二叉樹的區別

riemann_發表於2020-09-25

一、平衡二叉樹(AVL樹)

1、概念

AVL樹是帶有平衡條件的二叉查詢樹,一般是用平衡因子差值判斷是否平衡並通過旋轉來實現平衡,左右子樹樹高不超過1,和紅黑樹相比,AVL樹是嚴格的平衡二叉樹,平衡條件必須滿足(所有節點的左右子樹高度差不超過1)。不管我們是執行插入還是刪除操作,只要不滿足上面的條件,就要通過旋轉來保持平衡,而旋轉非常耗時的,由此我們可以知道AVL樹適合用於插入與刪除次數比較少,但查詢多的情況。

2、侷限性

由於維護這種高度平衡所付出的代價比從中獲得的效率收益還大,故而實際的應用不多,更多的地方是用追求區域性而不是非常嚴格整體平衡的紅黑樹。當然,如果應用場景中對插入刪除不頻繁,只是對查詢要求較高,那麼AVL還是較優於紅黑樹。

3、應用

Windows NT核心中廣泛存在。

二、紅黑樹

1、概念

一種二叉查詢樹,但在每個節點增加一個儲存位表示節點的顏色,可以是紅或黑(非紅即黑)。通過對任何一條從根到葉子的路徑上各個節點著色的方式的限制,紅黑樹確保沒有一條路徑會比其它路徑長出兩倍,因此,紅黑樹是一種弱平衡二叉樹(由於是弱平衡,可以看到,在相同的節點情況下,AVL樹的高度低於紅黑樹),相對於要求嚴格的AVL樹來說,它的旋轉次數少,所以對於搜尋,插入,刪除操作較多的情況下,我們就用紅黑樹

2、性質

在這裡插入圖片描述

  • 每個節點非紅即黑
  • 根節點是黑的
  • 每個葉節點(葉節點即樹尾端NULL指標或NULL節點)都是黑的
  • 如圖所示,如果一個節點是紅的,那麼它的兩兒子都是黑的
  • 對於任意節點而言,其到葉子點樹NULL指標的每條路徑都包含相同數目的黑節點
  • 每條路徑都包含相同的黑節點

3、應用

  • 廣泛用於C ++STL中,地圖和集都是用紅黑樹實現的
  • 著名的Linux的的程式排程完全公平排程程式,用紅黑樹管理程式控制塊,程式的虛擬記憶體區域都儲存在一顆紅黑樹上,每個虛擬地址區域都對應紅黑樹的一個節點,左指標指向相鄰的地址虛擬儲存區域,右指標指向相鄰的高地址虛擬地址空間
  • IO多路複用的epoll的的實現採用紅黑樹組織管理的的的sockfd,以支援快速的增刪改查
  • Nginx的的的中用紅黑樹管理定時器,因為紅黑樹是有序的,可以很快的得到距離當前最小的定時器
  • Java的的的中TreeMap中的實現

相關文章