Я вижу две проблемы в следующем фрагменте кода:
if(node.left != null && node.right != null) throw new InvalidPositionException();
node.parent.left = null;
node.parent.right = null;
Первая строка, кажется, проверяет, является ли узел действительно leaf , но логика c неправильно. В настоящее время он проверяет, имеет ли узел два дочерних элемента, но он даже должен отклонить ситуацию, когда у него есть один дочерний элемент. Таким образом, &&
должен быть ||
.
Две другие строки очищают связи с двумя дочерними узлами, в то время как он должен только отсоединять текущий узел, а не его одноуровневый узел. Таким образом, вам необходимо выяснить, является ли текущий узел левым или правым дочерним элементом своего родителя, и очистить только эту ссылку:
if (node.left != null || node.right != null) throw new InvalidPositionException();
if (node.parent.left == node) {
node.parent.left = null;
} else {
node.parent.right = null;
}
Это все еще не очень хорошо подходит для граничного случая, когда узел является root сам (последний узел в дереве). В этом случае parent
, вероятно, будет null
(это зависит от вашей реализации). Так что вам нужно добавить условие для этого. И если у вас есть ссылка root
на узел root дерева, то этот root
должен быть очищен:
if (node.left != null || node.right != null) throw new InvalidPositionException();
if (node.parent == null) {
root = null; // this assumes you have such a variable...
} else if (node.parent.left == node) {
node.parent.left = null;
} else {
node.parent.right = null;
}