Из оригинальной реализации Марка Аллена Вейса RedBlackTree из Структуры данных и решение проблем Использование Java найдено здесь.
Кажется, я не могу понять, как удалить узел из дерева. Прочитав ресурс википедии, я заметил функцию "is_leaf()". , проблема с этой реализацией и реализацией Марка Вайса заключается в том, что невозможно определить, какой узел является листом, а какой нет.
void delete_one_child(struct node *n)
{
/*
* Precondition: n has at most one non-null child.
*/
struct node *child = is_leaf(n->right) ? n->left : n->right;
replace_node(n, child);
if (n->color == BLACK) {
if (child->color == RED)
child->color = BLACK;
else
delete_case1(child);
}
free(n);
}
Java-реализация Is_Leaf
public boolean isLeaf(){
if(left == null && right == null){
return false;
}
return true;
}
Консольный вывод
value=1 color=1 leaf=true left=null right=14
value=2 color=1 leaf=true left=null right=5
value=5 color=0 leaf=true left=null right=null
value=7 color=0 leaf=true left=2 right=11
value=8 color=0 leaf=true left=null right=null
value=11 color=1 leaf=true left=8 right=null
value=14 color=1 leaf=true left=7 right=15
value=15 color=1 leaf=true left=null right=null
Формат дерева (из консоли)
└── (1) 1
└── (1) 14
├── (0) 7
│ ├── (1) 2
│ │ └── (0) 5
│ └── (1) 11
│ └── (0) 8
└── (1) 15
Правила:
- Корень черный
- У каждого красного узла есть черный родитель
- Любые дочерние элементы красного узла являются черными. У красного узла не может быть красных дочерних элементов.
- Каждый путь от корня к листу содержит одинаковое количество черных узлов.
Итак, мой вопрос: как мне реализовать удаление из этой реализации Red и Back Trees?