1. 程式人生 > >教你透徹瞭解紅黑樹---第一篇

教你透徹瞭解紅黑樹---第一篇

文章《教你透徹瞭解紅黑樹—第二篇》,主要說明了紅黑樹的旋轉、插入、刪除等操作。

1 背景知識

1.1 二叉樹

二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用於實現二叉查詢樹和二叉堆。

以上參考Wikipedia-binary tree中的介紹

1.2 常見二叉樹

  • 完全二叉樹:若二叉樹的高度是h,除第h層之外,其他(1~h-1)層的節點數都達到了最大個數,並且第h層的節點都連續的集中在最左邊。實際上,完全二叉樹和堆聯絡比較緊密哈,同時完全二叉樹不一定是滿二叉樹,反之一定是。

  • 滿二叉樹:除最後一層外,每一層上的所有節點都有兩個子節點,最後一層都是葉子節點。

  • 哈夫曼樹:又稱為最有數,這是一種帶權路徑長度最短的樹。哈夫曼編碼就是哈夫曼樹的應用。

  • 平衡二叉樹:平衡二叉樹又稱AVL樹(Adelson-Velskii and Landis Tree),左右兩個子樹的高度差的絕對值不超過 1,其子樹也遵循該規則。

  • 紅黑樹:紅黑樹是每個節點都帶顏色的樹,節點顏色或是紅色或是黑色,紅黑樹是一種查詢樹。紅黑樹有一個重要的性質,從根節點到葉子節點的最長的路徑不多於最短的路徑的長度的兩倍。對於紅黑樹,插入,刪除,查詢的複雜度都是O(log N)。

AVL樹得名於它的發明者 G.M. Adelson-Velsky 和 E.M. Landis,二人在 1962 年的論文 “An algorithm for the organization of information” 中發表了它

1.3 二叉樹詳細介紹

有關二叉樹的詳細說明,請進入這篇文章檢視《教你透徹瞭解二叉樹》

2 紅黑樹簡介

2.1 紅黑樹

A red–black tree is a kind of self-balancing binary search tree. Each node of the binary tree has an extra bit, and that bit is often interpreted as the color (red or black) of the node. These color bits are used to ensure the tree remains approximately balanced during insertions and deletions.

簡單翻譯如下:

紅黑樹,一種自平衡的二叉查詢樹,但在每個結點上有一個額外的儲存位表示結點的顏色,可以是Red或Black。這些顏色位用來確保紅黑樹在插入和刪除操作後仍能夠近乎平衡。

既然紅黑樹作為一棵二叉查詢樹(Binary Search Tree, 又稱二叉排序樹,一個意思),滿足二叉查詢樹的一般性質。下面,來了解下二叉查詢樹的一般性質。

二叉查詢樹或者是一棵空樹,或者是具有下列性質的二叉樹:

  1. 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
  2. 若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
  3. 左、右子樹也分別為二叉排序樹;
  4. 沒有鍵值相等的節點。

二叉查詢樹是一棵動態樹,樹的結構是變化的,是依據插入或刪除後的結構來構成的。

一棵由n個節點組成的二叉查詢樹,其高度至少為log2(n+1),其一般操作的時間複雜度O(log2(n+1)),這個時間複雜度可以理解成其遍歷一次所訪問的節點數。但是,如果這棵樹退化為一棵鏈狀的樹,其時間複雜度就轉變為O(n)。

紅黑樹時間複雜度顯然不會為最糟糕的O(n),其操作時間複雜度最糟糕是O(log2(n+1)),這是因為它在二叉查詢樹的基礎上增加了著色和相關的性質使得紅黑樹相對平衡。

維基百科(Wikipedia)中介紹為以下屬性:

  1. A node is either red or black.
  2. The root is black. This rule is sometimes omitted. Since the root can always be changed from red to black, but not necessarily vice versa, this rule has little effect on analysis.
  3. All leaves (NIL) are black.
  4. If a node is red, then both its children are black.
  5. Every path from a given node to any of its descendant NIL nodes contains the same number of black nodes. The uniform number of black nodes in the paths from root to leaves is called the black-height of the red–black tree.

簡單翻譯就是:

  1. 每個結點要麼是紅的要麼是黑的。
  2. 根結點是黑的。
  3. 每個葉結點(葉結點即指樹尾端NIL指標或NULL結點)都是黑的。
  4. 如果一個結點是紅的,那麼它的兩個兒子都是黑的。
  5. 對於任意結點而言,其到葉結點樹尾端NIL指標的每條路徑都包含相同數目的黑結點。

下圖即是一棵紅黑樹,圖片來源於Wikipedia-binary tree
An example of a red–black tree

》》》注意上圖中的葉節點並沒有畫出來,而是以NIL指標代替,這是因為葉節點在這裡並不包含資料,只是作為結束符。

總結:上述內容旨在熟悉紅黑樹的基本屬性,有關其旋轉/插入/刪除/查詢等操作將會在《教你透徹瞭解紅黑樹—第二篇目》中詳細說明。