初涉紅黑樹

紅黑樹是什麼

紅黑樹是一種含有紅黑結點並且能夠自平衡的二叉查找樹

紅黑樹的性質如下:

  1. 每個節點要麼是黑色,要麼是紅色。
  2. 根節點是黑色。
  3. 每個葉子節點(NIL)是黑色。
  4. 每個紅色結點的兩個子結點一定都是黑色。
  5. 任意一結點到每個葉子結點的路徑都包含數量相同的黑結點。
    在這裏插入圖片描述
    紅黑樹並不是一個完美平衡二叉查找樹,從上圖可以看到,根結點P的左子樹顯然比右子樹高,但左子樹和右子樹的黑結點的層數是相等的,也即任意一個結點到到每個葉子結點的路徑都包含數量相同的黑結點(性質5)。所以我們叫紅黑樹這種平衡爲黑色完美平衡
    正在處理遍歷的結點即爲當前結點

紅黑樹的自平衡

紅黑樹的自平衡依靠三種操作:左旋、右旋和變色

  • 左旋:以某個結點作爲支點(旋轉結點),其右子結點變爲旋轉結點的父結點,右子結點的左子結點變爲旋轉結點的右子結點,左子結點保持不變。如下圖。左旋隻影響旋轉結點和其右子樹的結構,把右子樹的結點往左子樹挪了。
    在這裏插入圖片描述
  • 右旋:以某個結點作爲支點(旋轉結點),其左子結點變爲旋轉結點的父結點,左子結點的右子結點變爲旋轉結點的左子結點,右子結點保持不變。如下圖。右旋隻影響旋轉結點和其左子樹的結構,把左子樹的結點往右子樹挪了。
    在這裏插入圖片描述
  • 變色:結點的顏色由紅變黑或由黑變紅。

紅黑樹的查找

因爲紅黑樹是一顆二叉平衡樹,並且查找不會破壞樹的平衡,所以查找跟二叉平衡樹的查找無異:

  1. 從根結點開始查找,把根結點設置爲當前結點;
  2. 若當前結點爲空,返回null;
  3. 若當前結點不爲空,用當前結點的key跟查找key作比較;
  4. 若當前結點key等於查找key,那麼該key就是查找目標,返回當前結點;
  5. 若當前結點key大於查找key,把當前結點的左子結點設置爲當前結點,重複步驟2;
  6. 若當前結點key小於查找key,把當前結點的右子結點設置爲當前結點,重複步驟2;

正由於紅黑樹總保持黑色完美平衡,所以它的查找最壞時間複雜度爲O(2lgN)

在這裏插入圖片描述

紅黑樹的插入

插入操作包括兩部分工作:一查找插入的位置;二插入後自平衡。查找插入的父結點很簡單,跟查找操作區別不大:

  1. 從根結點開始查找;
  2. 若根結點爲空,那麼插入結點作爲根結點,結束。
  3. 若根結點不爲空,那麼把根結點作爲當前結點;
  4. 若當前結點爲null,返回當前結點的父結點,結束。
  5. 若當前結點key等於查找key,那麼該key所在結點就是插入結點,更新結點的值,結束。
  6. 若當前結點key大於查找key,把當前結點的左子結點設置爲當前結點,重複步驟4;
  7. 若當前結點key小於查找key,把當前結點的右子結點設置爲當前結點,重複步驟4;
    在這裏插入圖片描述
    插入位置找到後,把插入結點放到正確的位置即可,但插入結點是應該是什麼顏色呢?答案是紅色。理由很簡單,紅色在父結點(如果存在)爲黑色結點時,紅黑樹的黑色平衡沒被破壞,不需要做自平衡操作。但如果插入結點是黑色,那麼插入位置所在的子樹黑色結點總是多1,必須做自平衡

紅黑樹的刪除

紅黑樹的刪除操作也包括兩部分工作:一查找目標結點;而刪除後自平衡。查找目標結點顯然可以複用查找操作,當不存在目標結點時,忽略本次操作;當存在目標結點時,刪除後就得做自平衡處理了。刪除了結點後我們還需要找結點來替代刪除結點的位置,不然子樹跟父輩結點斷開了,除非刪除結點剛好沒子結點,那麼就不需要替代。

二叉樹刪除結點找替代結點有3種情情景:

  • 情景1:若刪除結點無子結點,直接刪除
  • 情景2:若刪除結點只有一個子結點,用子結點替換刪除結點
  • 情景3:若刪除結點有兩個子結點,用後繼結點(大於刪除結點的最小結點)替換刪除結點

原文地址在此

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