forked from vieter-v/libvieter
fix(tree): fix wrong rotation function
This commit is contained in:
parent
17c2e15385
commit
70217bee21
4 changed files with 71 additions and 2 deletions
|
|
@ -21,8 +21,12 @@ bool vieter_tree_node_validate(vieter_tree_node *node,
|
|||
vieter_tree_node_get(node->children[0], vieter_tree_node_black)) &&
|
||||
(node->children[1] == NULL ||
|
||||
vieter_tree_node_get(node->children[1], vieter_tree_node_black)));
|
||||
bool right_child_flag_set =
|
||||
node->parent == NULL ||
|
||||
(vieter_tree_node_get(node, vieter_tree_node_right) ==
|
||||
(node->parent->children[1] == node));
|
||||
|
||||
return correctly_colored_children &&
|
||||
return correctly_colored_children && right_child_flag_set &&
|
||||
vieter_tree_node_validate(node->children[0], passed_black_nodes,
|
||||
expected_black_nodes) &&
|
||||
vieter_tree_node_validate(node->children[1], passed_black_nodes,
|
||||
|
|
@ -128,6 +132,14 @@ vieter_tree_node *vieter_tree_node_rotate(vieter_tree_node *old_root,
|
|||
bool dir) {
|
||||
vieter_tree_node *new_root = old_root->children[1 - dir];
|
||||
|
||||
if (old_root->parent != NULL) {
|
||||
vieter_tree_node_set_child(
|
||||
old_root->parent, new_root,
|
||||
vieter_tree_node_get(old_root, vieter_tree_node_right));
|
||||
} else {
|
||||
new_root->parent = NULL;
|
||||
}
|
||||
|
||||
// Right rotation
|
||||
if (dir) {
|
||||
vieter_tree_node_set_child(old_root, new_root->children[1], false);
|
||||
|
|
|
|||
|
|
@ -17,4 +17,5 @@ void vieter_tree_node_balance_after_insert(vieter_tree_node *node);
|
|||
*/
|
||||
void vieter_tree_node_remove_balanced(vieter_tree_node *node);
|
||||
|
||||
vieter_tree_node *vieter_tree_node_rotate(vieter_tree_node *old_root, bool dir);
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue