學習紅黑樹原理,網路上有很多文章。學習紅黑樹的具體實現,個人推薦去看jdk中的treemap原始碼。因為該原始碼很簡潔,並且很容易改為其它語言的實現,最重要的是該份實現得到世人的認可,可以保證是沒問題的**。
下面是我根據其實現,使用c語言改寫的紅黑樹實現,目前只有紅黑樹的插入實現。
#include #include enum color ;
typedef struct node node , *tree;
node* p(node* x)
node* u(node* x)
else
}int color(node* x)
else
}void ll(tree &t,node *x)
y->parent = x->parent;
if(x->parent != null)
else
} else
y->left = x;
x->parent = y; }}
void rr(tree &t,node *x)
y->parent = x->parent;
if(p(x) != null)
else
} else
y->right = x;
x->parent = y;
} }void fixupafterinsert(tree &t,node *x)
else
//然後著色,父黑色,祖父是紅色
p(x)->color = black;
p(p(x))->color = red;
rr(t,p(p(x)));
//此時黑色的父是根,x是左子,祖是右子
//調整完畢
}} else else
//著色,然後左旋
p(x)->color = black;
p(p(x))->color = red;
ll(t,p(p(x)));
}} }
//此處處理根
t->color = black;
}void print(node *x)
}void insert(tree &t ,int n)
else else
} x = (node*)malloc(sizeof(node));
x->left = null;
x->right = null;
x->value = n;
x->color = red;
x->parent = p;
if(n < p->value)
else
fixupafterinsert(t,x); }}
int main(void)
該原始碼確定能夠執行。
紅黑樹C 實現
完整實現了一遍紅黑樹,程式就當作自己的筆記好了 紅黑樹,顧名思義,就是紅黑相間的樹,它借由紅黑規則實現了二叉排序樹的平衡。紅黑規則如下 1.每個節點不是紅就是黑 2.根總是黑色 3.若節點為紅色,它的子節點必須為黑色 4.從根到葉的每條路徑,必須包含相同數目的黑色節點 插入和刪除節點時都要遵循紅黑規...
紅黑樹實現
紅黑樹 是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是red或black。通過對任何一條從根到葉子簡單路徑上的 顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡 由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個...
紅黑樹實現
按演算法導論裡的偽 用c 實現了紅黑樹。實現過程中,參考了nginx的紅黑樹實現,特別是右旋的實現,演算法導論裡沒有給出,就借鑑了nginx的實現。對比了nginx的紅黑樹實現和演算法導論裡的偽 插入基本上一樣的,刪除兩者有點差別,但思路應該是一樣的。實現過程中需要注意的是,空葉子結點一定要實現,不...