紅黑樹的五個特性如下:
紅黑樹是一棵平衡二叉樹
每個節點非紅即黑
根節點是黑色
紅節點的子節點必為黑色
任一節點到其各個葉子節點所經過的黑色節點是相等的
nginx中的紅黑樹資料結構如下:
紅黑樹的插入通常會以平衡二叉樹的方式先插入,然後再對節點造成的不平衡進行處理.struct ngx_rbtree_s;// 這是紅黑樹的結構
struct ngx_rbtree_node_s;
平衡樹的左旋操作:void
ngx_rbtree_insert(ngx_rbtree_t *tree, ngx_rbtree_node_t *node)
tree->insert(*root, sentinel, node);//呼叫自定義的插入節點方法
/*新插入的節點為紅色,如果父節點也是紅色,則平衡被破壞,需要處理*/
while(node != *root && ngx_rbt_is_red(node->parent))else
//如果叔父節點是黑色或者是乙個葉子,則說明父節點和叔父節點的平衡因子大於1,
//失去平衡,則需要對祖父節點進行右旋,先將父節點染黑,將祖父節點染紅,對祖父節點右旋
ngx_rbt_black(node->parent);
ngx_rbt_red(node->parent->parent);
ngx_rbtree_right_rotate(root, sentinel, node->parent->parent);
}}else else
ngx_rbt_black(node->parent);
ngx_rbt_red(node->parent->parent);
ngx_rbtree_left_rotate(root, sentinel, node->parent->parent);}}
}ngx_rbt_black(*root);
}
將當前節點的右節點作為當前節點的父節點,將當前節點右節點的左節點作為當前節點的右節點;
平衡樹的右旋操作:static ngx_inline void
ngx_rbtree_left_rotate(ngx_rbtree_node_t **root, ngx_rbtree_node_t *sentinel,
ngx_rbtree_node_t *node)
temp->parent = node->parent;//改變右節點的父指標
if(node == *root)else if (node == node->parent->left) else
temp->left = node;//最後將當前節點賦給其右節點的左節點,完成左旋
node->parent = temp;//修改父指標指向
}
右旋是將當前節點的左節點的右節點賦給當前節點的右節點,將當前節點賦給當前節點左節點的右節點.
紅黑樹的刪除:static ngx_inline void
ngx_rbtree_right_rotate(ngx_rbtree_node_t **root, ngx_rbtree_node_t *sentinel,
ngx_rbtree_node_t *node)
temp->parent = node->parent;//修改左節點的父指標
/*修改祖父節點的左指標或右指標*/
if (node == *root) else if (node == node->parent->right) else
temp->right = node;//最後將當前節點賦給其左節點的右節點
node->parent = temp;//修改當前節點的父節點為其左節點,旋轉完成
}
void
ngx_rbtree_delete(ngx_rbtree_t *tree, ngx_rbtree_node_t *node)
else if (node->right == sentinel) elseelse
}if(subst == *root)
red = ngx_rbt_is_red(subst);
if(subst == subst->parent->left)else
}
紅黑樹簡要分析
1 節點是紅色或者黑色 2 根節點是黑色的 3紅色的節點的孩子必須是黑色的 也就是紅節點下的孩子節點必須是黑色的 4每乙個從根節點到葉子節點的黑色節點數量都必須一致 5葉子節點是黑色的 紅黑樹主要在於新增和刪除的各種情況 預設新增節點為紅色節點 那麼就會出現雙紅缺陷 有兩個紅色的連著的節點 這是不合...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...