數據結構:紅黑樹

前言

掌握好數據結構是咱們學習算法的基礎。例如基本的數組、鏈表、二叉樹、堆、棧到複雜的圖等等。今天咱們就來分析一下紅黑樹是一種怎麼樣的結構。程序員

基本概念

紅黑樹是一種自平衡二叉查找樹。這裏涉及到了幾個概念:平衡、二叉、查找。
二叉樹:由不一樣的節點組成,每個節點有左子節點和右子節點,一個節點最多兩個子節點,這種就叫二叉樹。
例如:
二叉查找樹:上圖的二叉樹是普通的二叉樹,有時候咱們但願二叉樹能具備一些功能便於咱們查詢節點,這時候就有了二叉查找樹,也叫二叉搜索樹。二叉查找樹的原理是左子節點(包括其子節點)的值小於(可能等於,看使用需求)當前節點,右子節點(包括其子節點)大於當前節點。並且這個原理對每一個子節點都適用。這樣咱們查詢的速度就從O(n)變成了O(logn)。
例如:
這樣看起來挺美好,可是考慮極端狀況呢?例如:

這個樣子的樹是二叉搜索樹嗎?是,可是看起來特別不平衡,數據所有堆積在左邊,並且最重要的是,這樣會致使查詢速度從O(logn)退化成了O(n)。
所以,後面又發明了自平衡二叉查找樹,有好幾種,AVL、紅黑樹等,其中性能比較好的就是紅黑樹。Java中的TreeMap結構就使用了這個數據結構,不只如此,在JDK1.8中HashMap單數組上鍊表長度超過8便會變成紅黑樹,來節省map在哈希衝突嚴重時的查詢時間。因而可知紅黑樹的重要性。算法

紅黑樹的定義

  • 每一個節點要麼是紅色,要麼是黑色
  • 根節點是黑色
  • 每一個葉子節點都是黑色的空節點(null節點)
  • 每一個紅色節點的兩個子節點是黑色。(從每一個葉子到根的全部路徑上不能有兩個連續的紅色節點)
  • 從任一節點到其每一個葉子的全部路徑都包含相同數目的黑色節點。
    如圖:
    (圖轉自程序員小灰 https://zhuanlan.zhihu.com/p/31805309)
相關文章
相關標籤/搜索