У меня есть BinarySearchTree
, который состоит из узлов, которые являются шаблоном класса dataType student, где student - это класс с личными переменными имени и класса.
В данный момент я могу распечатать дерево, найти имена и / или оценки в дереве, но у меня возникают проблемы при удалении узлов из дерева.
Я пытаюсь удалить всех учеников, у которых был <50 баллов (так не получилось). </p>
После удаления узла необходимо выполнить одно из следующих действий:
- Левый дочерний элемент пуст: замените узел его правым дочерним элементом.
- Левый потомок не пуст: замените узел на самый высокий элемент слева
ветви.
Насколько я понимаю, если бы это было дерево:
1
/ \
2 3
/ \ /\
4 5 6 7
Если 2 не пройден, т.е. имел оценку <50 </p>
В итоге вы получите
1
/ \
4 3
\ / \
5 6 7
4 - самый высокий элемент в левой ветви.
Если это было дерево:
1
/ \
2 3
\ / \
5 6 7
и 2 не удалось
вы бы в итоге получили
1
/ \
5 3
/ \
6 7
Если это было дерево:
1
/ \
2 3
/ \ / \
4 5 6 7
и 1 не удалось
вы бы в итоге получили
5
/ \
2 3
/ / \
4 6 7
У меня было много проблем при попытке создать функции для этого, на данный момент у меня есть:
void checkBranch() //called from main - used to pass the root node to checkBranch()
{
checkBranch(studentTree.getRoot());
}
bool checkBranch(BTNode<Student>* currentNode)
{
if (currentNode != NULL)
{
if (checkBranch(currentNode -> getLeft()))
{
deleteNode(currentNode, true);
}
if (checkBranch(currentNode -> getRight()))
{
deleteNode(currentNode, false);
}
return (currentNode -> getData().getGrade() < 50.0);
}
else
{
return false;
}
}
Теперь я пытаюсь добавить функцию deleteNode
, где я просто застрял в том, что делать / обрабатывать, что должно произойти:
void deleteNode(BTNode<Student> *parentNode, bool left)
{
BTNode<Student>* nodeToDelete;
if (left)
{
nodeToDelete = parentNode->getLeft();
}
}