Nginx紅黑樹分析

2021-09-29 02:29:11 字數 2279 閱讀 7307

紅黑樹的五個特性如下:

紅黑樹是一棵平衡二叉樹

每個節點非紅即黑

根節點是黑色

紅節點的子節點必為黑色

任一節點到其各個葉子節點所經過的黑色節點是相等的

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