#java #counting #red-black-tree
#java #подсчет #red-black-tree
Вопрос:
Я создаю программу для определения количества красных узлов в красно-черном дереве. Я уже реализовал RED BLACK BST, который строит дерево после считывания введенного текста. Я застрял на том, как подсчитать количество красных узлов? Я знаю, что красные узлы могут быть только левосторонними, а у красного родительского узла не может быть красного дочернего узла. Какой метод был бы подходящим для решения этой проблемы?
Комментарии:
1. Пожалуйста, поделитесь кодом, который у вас есть на данный момент (построение дерева и подсчет узлов)!
2. Я добавил то, что у меня есть
3. Вы бы передали корневой узел своему методу countRed, чем рекурсивно вызывать его снова с помощью left amp; right node (при вызове isRed). Вы должны попробовать!
4. @Alex Я обновил свой код! Однако в настоящее время я получаю исключение с нулевым указателем
5. на самом деле сейчас я получаю эту ошибку: на нестатическую переменную root нельзя ссылаться из статического контекста, когда я запускаю ее в моем основном методе
Ответ №1:
Рекурсивное решение будет выглядеть следующим образом:
public static int countRed(Node node) {
int nbRed = 0;
if (node == null) {
return 0;
}
nbRed = countRed(node.left);
nbRed = countRed(node.right);
if(node.isRed()){
nbRed ;
}
return nbRed;
}
Протестировано
Я тестировал ваш код с помощью простого цикла:
RedBlackBST tree = new RedBlackBST();
tree.root = tree.put(null, 0, 0);
for (int i = 1; i < 10; i ) {
tree.root = tree.put(tree.root, i, i);
}
int redTotal = tree.countRed(tree.root);
Это возвращает в общей сложности 3 красных. Если я проверю это в debug, это точно.
Если вы чувствуете, что значение недопустимо, тогда вам следует проверить свое дерево в debug и определить, что недопустимо в вашей структуре.
Комментарии:
1. Спасибо! Однако я все еще получаю ошибку: на нестатическую переменную root нельзя ссылаться из статического контекста, когда я запускаю ее в своем основном методе … и когда я меняю свой корневой узел на статический, тогда он говорит, что на узел нестатического метода нельзя ссылаться из статического контекста, когда я запускаю его в своем основном методе?
2. Измените ‘tree.countRed(дерево);’ на ‘tree.countRed(дерево.корень);’ И ‘if (root.isRed(корень))’ на ‘if (isRed (корень))’
3. Вашему коду был бы полезен небольшой рефакторинг. например, метод ‘isRed’ => это должен / может быть метод в Node, поэтому вы должны вызывать ‘node.isRed()’ вместо ‘isRed (узел)’
4. спасибо за всю вашу помощь! Он компилируется и запускается сейчас, однако он неправильно подсчитывает узлы, поэтому, я думаю, я начну сначала.
5. код для других методов был предоставлен в учебнике, так что, вы думаете, проблема в моем методе подсчета?