AVL
AVL(balance binary tree)#
- AVL树本质上还是一棵二叉搜索树; AVL树的任何子树仍然是AVL树; 每个节点的左右子节点的高度之差的绝对值最多为1
AVL Imbalance#
- 节点失衡, 节点左子树与右子树高度差大于1
LL#
- 发生条件: 插入新节点, 节点失衡, 左子树比右子树高2, 造成失衡的子节点是左子树
- 调整方式: 右旋
LR#
- 发生条件: 插入新节点, 节点失衡, 左子树比右子树高2, 造成失衡的子节点是右子树
- 调整方式: 左子树左旋, 转化为LL失衡, 再右旋
RR#
- 发生条件: 插入新节点, 节点失衡, 右子树比左子树高2, 造成失衡的子节点是右子树
- 调整方式: 左旋
RL#
- 发生条件: 插入新节点, 节点失衡, 右子树比左子树高2, 造成失衡的子节点是左子树
- 调整方式: 右子树右旋, 转化为RR失衡, 再左旋
_left_rotate#
static ngx_inline void
bst_left_rotate(bst_node_t **root, bst_node_t *sentinel,
bst_node_t *node)
{
bst_node_t *temp;
temp = node->right;
node->right = temp->left;
if (temp->left != sentinel) {
temp->left->parent = node;
}
temp->parent = node->parent;
if (node == *root) {
*root = temp;
} else if (node == node->parent->left) {
node->parent->left = temp;
} else {
node->parent->right = temp;
}
temp->left = node;
node->parent = temp;
}
_right_rotate#
static ngx_inline void
bst_right_rotate(bst_node_t **root, bst_node_t *sentinel,
bst_node_t *node)
{
bst_node_t *temp;
temp = node->left;
node->left = temp->right;
if (temp->right != sentinel) {
temp->right->parent = node;
}
temp->parent = node->parent;
if (node == *root) {
*root = temp;
} else if (node == node->parent->right) {
node->parent->right = temp;
} else {
node->parent->left = temp;
}
temp->right = node;
node->parent = temp;
}