按演算法導論裡的偽**用c++實現了紅黑樹。實現過程中,參考了nginx的紅黑樹實現,特別是右旋的實現,演算法導論裡沒有給出,就借鑑了nginx的實現。
對比了nginx的紅黑樹實現和演算法導論裡的偽**,插入基本上一樣的,刪除兩者有點差別,但思路應該是一樣的。
實現過程中需要注意的是,空葉子結點一定要實現,不能用空指標替代,不然會出現空指標錯誤。
class rb_tree_node
int key;
int color;
rb_tree_node* parent;
rb_tree_node* left;
rb_tree_node* right;
};class rb_tree
void insert(rb_tree_node* z);
void rb_delete(rb_tree_node* z);
void inorder_tree_walk(rb_tree_node* x);
rb_tree_node* search(rb_tree_node* x, int k);
rb_tree_node* minimum(rb_tree_node* x);
void left_rotate(rb_tree_node* x);
void right_rotate(rb_tree_node* x);
void insert_fixup(rb_tree_node* z);
void transplant(rb_tree_node* u, rb_tree_node* v);
void delete_fixup(rb_tree_node* x);
rb_tree_node* root;
rb_tree_node* null_end;
};bool rb_tree_node_is_red(rb_tree_node* node)
bool rb_tree_node_is_black(rb_tree_node* node)
void rb_tree::left_rotate(rb_tree_node* x)
y->parent = x->parent;
if (x->parent == null_end)
else if (x == x->parent->left)
else
y->left = x;
x->parent = y;
}void rb_tree::right_rotate(rb_tree_node* node)
temp->parent = node->parent;
if (node->parent == null_end)
else if (node == node->parent->right)
else
temp->right = node;
node->parent = temp;
}void rb_tree::insert(rb_tree_node* z)
else
}z->parent = y;
if (y == null_end)
else if(z->key < y->key)
else
z->left = null_end;
z->right = null_end;
z->color = 1;
insert_fixup(z);
}void rb_tree::rb_delete(rb_tree_node* z)
else if (z->right == null_end)
else
else
transplant(z, y);
y->left = z->left;
y->left->parent = y;
y->color = z->color;
} if (y_ori_color == 0)
delete z;
}void rb_tree::inorder_tree_walk(rb_tree_node* x)
}rb_tree_node* rb_tree::search(rb_tree_node* x, int k)
if (k < x->key)
else }
rb_tree_node* rb_tree::minimum(rb_tree_node* x)
void rb_tree::insert_fixup(rb_tree_node* z)
else
z->parent->color = 0;
z->parent->parent->color = 1;
right_rotate(z->parent->parent);}}
else
else
z->parent->color = 0;
z->parent->parent->color = 1;
left_rotate(z->parent->parent);
}} }
root->color = 0;
}void rb_tree::transplant(rb_tree_node* u, rb_tree_node* v)
else if (u == u->parent->left)
else
v->parent = u->parent;
}void rb_tree::delete_fixup(rb_tree_node* temp)
if ( rb_tree_node_is_black(w->left) &&
rb_tree_node_is_black(w->right) )
else
w->color = temp->parent->color;
temp->parent->color = 0;
w->right->color = 0;
left_rotate(temp->parent);
temp = root;}}
else
if (rb_tree_node_is_black(w->right) &&
rb_tree_node_is_black(w->left))
else
w->color = temp->parent->color;
temp->parent->color = 0;
w->left->color = 0;
right_rotate(temp->parent);
temp = root;
}} }
temp->color = 0;
}
紅黑樹實現
紅黑樹 是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是red或black。通過對任何一條從根到葉子簡單路徑上的 顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡 由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...