紅黑樹實現

2021-08-20 20:21:28 字數 3283 閱讀 5908

按演算法導論裡的偽**用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.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...