顏色調整,第一種情況uncle存在且為紅色,第二種和第三種情況,uncle不存在 uncle存在且為黑色,先處理第三種情況,針對parent進行左單旋。
「test.cpp」
#include
using namespace std;
enum colour
;template
struct rbtreenode
};template
class rbtree
bool insert(const k& key,const v& value)
node* cur = _root;
node* parent = null;
while(cur)
else if(cur->_key < key)
else
return false;
} cur = new node(key,value);
if(parent->_key > key)
else
//顏色調整
while(cur != _root && parent->_col == red)
//第二種和第三種情況
//uncle不存在/uncle存在且為黑色
else
//第三種情況處理公升級後變成第二種情況
//和第二種情況一起處理
_r_roteta(grandfather);
grandfather->_col = red;
parent->_col = black;
break;}}
else//parent == grandfather->_right
//第二種情況和第三種情況
//uncle不存在/uncle存在且為黑色
else
//第三種情況公升級為第二種情況
//統一處理第二種情況
_l_roteta(grandfather);
parent->_col = black;
grandfather->_col = red;
break;}}
} _root->_col = black;
return true;
} void inorder()
size_t k = 0;
return _isblance(_root,k,blackcount);
}protected:
bool _isblance(node* root,size_t k,const size_t blackcount)
void _inorder(node* root)
_inorder(root->_left);
cout<_key _inorder>_right);
} void _l_roteta(node* parent)
else
}void _r_roteta(node* parent)
else
}private:
node* _root;
};void test()
; size_t size = sizeof(arr)/sizeof(arr[0]);
for(int i = 0;i < size;i++)
{ rbt.insert(arr[i],i);
cout<
紅黑樹與平衡二叉樹
性質1.節點是紅色或黑色。性質2.根節點是黑色。性質3.每個葉子節點都是黑色的空節點 nil節點 性質4 每個紅色節點的兩個子節點都是黑色。從每個葉子到根的所有路徑上不能有兩個連續的紅色節點 性質5.從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。這些約束強制了紅黑樹的關鍵性質 從根到葉子...
二叉查詢樹 平衡二叉樹 紅黑樹
先看幾個基本概念 樹 由根出發,指向n個孩子,孩子再指向孫子。這樣一種資料結構 二叉樹 每個接點最多有兩個孩子的樹 二叉查詢樹 每個結點的左子樹 結點 右子樹 平衡二叉樹 每個結點左右子樹的高度差不大於1 紅黑樹 從任一節點到其每個葉子的所有簡單路徑 都包含相同數目的黑色節點。當然還有其它性質 幾點...
二叉查詢樹 平衡二叉樹 紅黑樹
平衡二叉樹 首先是一棵二叉查詢樹。帶有平衡條件 每個結點的左右子樹的高度之差的絕對值 平衡因子 最多為1。紅黑樹 雖然本質上是一棵二叉查詢樹,但它在二叉查詢樹的基礎上增加了著色和相關的性質使得紅黑樹相對平衡,從而保證了紅黑樹的查詢 插入 刪除的時間複雜度最壞為o log n 還具體下列的特性 節點是...