Я пытаюсь следовать алгоритму BST в «Структуры данных и алгоритмы» Гранвилла Барнетта, но я не понимаю описанный ниже алгоритм удаления узла.
Раздел 3.3 (стр. 22)
Удалить узел из BST довольно просто, нужно рассмотреть четыре случая:
- значение, которое нужно удалить, - это листовой узел; или
- значение, которое нужно удалить, имеет правое поддерево, но не левое поддерево; или
- значение, которое нужно удалить, имеет левое поддерево, но не правое поддерево; или
- значение, которое нужно удалить, имеет как левое, так и правое поддерево, и в этом случае мы продвигаем наибольшее значение в левое поддерево.
Рисунок 3.2 (стр. 22)
23
/ \
14 31
/
7
\
9
- Случай №1 указывает на узел 9.
- Случай № 2 указывает на узел 7.
- Случай № 3 указывает на узел 14.
- Случай № 4 указывает на узел 23.
Я интерпретирую приведенный выше текст для # 4 как означающий, что когда мы удаляем 23, мы повышаем 14 до корневого и делаем 31 его правым дочерним элементом:
14
/ \
7 31
\
9
... но алгоритм книги (со стр. 23) для случая № 4 вводит меня в заблуждение (я переписал его здесь на Java):
1 boolean remove(T value) {
2 // ...
3
4 // case #4
5 Node largestValueNode = nodeToRemove.left;
6 while (largestValueNode.right != null) {
7 // find the largest value in the left subtree of nodeToRemove
8 largestValueNode = largestValueNode.right;
9 }
10
11 // delete the right child of largestValueNode's parent
12 findParent(largestValueNode.value).right = null;
13 nodeToRemove.value = largestValueNode.value;
14
15 count--;
16 return true; // successful
17}
Если я следую алгоритму, largestValueNode
- это узел 14, поэтому его родительский узел - это узел 23. Почему алгоритм аннулирует правый дочерний элемент родителя?
Почему строка 13 копирует значение largestValueNode
в удаляемый узел?
Я ожидал, что строки 11-13 будут такими:
11 if (largestValueNode != null)
12 largestValueNode.right = nodeToRemove.right;
13 nodeToRemove.right = null;
РЕДАКТИРОВАТЬ:
В алгоритме книги действительно есть ошибка. Исправление ниже:
1 boolean remove(T value) {
2 // ...
3
4 // case #4
5 Node largestValueNode = nodeToRemove.left;
6 while (largestValueNode.right != null) {
7 // find the largest value in the left subtree of nodeToRemove
8 largestValueNode = largestValueNode.right;
9 }
10
11 Node p = findParent(largestValueNode.value);
12 if (p != null) {
13 if (nodeToRemove == p)
14 nodeToRemove.left = largestValueNode.left;
15 else
16 p.right = largestValueNode.left;
17 }
18 nodeToRemove.value = largestValueNode.value;
19
20 count--;
21 return true; // successful
22}
count--
в тексте есть следующая строка:nodeToRemove.Value = largestValueNode.Value
, которую вам здесь не хватает. - person Dan Nissenbaum   schedule 08.07.2012