Если каждый узел в дереве двоичного поиска сохраняет свой вес (количество узлов в его поддереве), то какой будет эффективный метод вычисления ранга данного узла (его индекс в отсортированном списке), когда я ищу его в дереве?Вычисление ранга узла в двоичном дереве поиска
ответ
Начните ранг в ноль. По мере того, как двоичный поиск переходит из корня, добавьте размеры всех левых поддеревьев, которые просканирует поиск, включая левое поддерево найденного узла.
I.e., когда поиск идет слева (от родительского до левого ребенка), он не обнаруживает новых значений меньше, чем найденный объект, поэтому ранжирование остается неизменным. Когда он идет правильно, родительский плюс все узлы в левом поддереве меньше, чем найденный элемент, поэтому добавьте один плюс размер левого поддерева. Когда он находит искомый элемент. любые элементы в левом поддереве узла, содержащего элемент, меньше его, поэтому добавьте его в ранг.
Сведя все это вместе:
int rank_of(NODE *tree, int val) {
int rank = 0;
while (tree) {
if (val < tree->val) // move to left subtree
tree = tree->left;
else if (val > tree->val) {
rank += 1 + size(tree->left);
tree = tree->right;
}
else
return rank + size(tree->left);
}
return NOT_FOUND; // not found
}
Это возвращает ранг с нуля. Если вам нужно 1-based, то инициализировать rank
до 1 вместо 0.
Поскольку каждый узел имеет поле хранить свой вес, то сначала вы должны реализовать размер вызова метода(), который возвращает количество узлов в substree узла в:
private int size(Node x)
{
if (x == null) return 0;
else return x.N;
}
затем вычислить ранг заданных узел легко
public int rank(Node key)
{ return rank(key,root) }
private int rank(Node key,Node root)
{
if root == null
return 0;
int cmp = key.compareTo(root);
// key are smaller than root, then the rank in the whole tree
// is equal to the rank in the left subtree of the root.
if (cmp < 0) {
return rank(key, root.left)
}
//key are bigger than root,the the rank in the whole tree is equal
// to the size of subtree of the root plus 1 (the root) plus the rank
//in the right sub tree of the root.
else if(cmp > 0){
return size(root.left) + 1 + rank(key,root.right);
}
// key equals to the root, the rank is the size of left subtree of the root
else return size(root.left);
}
Последнее слово 'else' неверно. Только левое поддерево корня содержит элементы, меньшие, чем искомое. – Gene
Зависит от реализации BST, но я считаю, что вы можете решить ее рекурсивно.
public int rank(Key key){
return rank(root, key);
}
private int rank(Node n, Key key){
int count = 0;
if (n == null)return 0;
if (key.compareTo(n.key) > 0) count++;
return count + rank(n.left, key) + rank(n.right, key);
}
- 1. Частота узла/значения в двоичном дереве поиска
- 2. Учет повторяющегося узла в двоичном дереве поиска
- 3. Получение родительского узла в двоичном дереве поиска
- 4. Исключение: удаление узла в двоичном дереве поиска
- 5. Удаление узла в двоичном дереве поиска
- 6. Вставка в двоичном дереве поиска против вставки в двоичном дереве
- 7. Поиск узла в двоичном дереве
- 8. Поиск узла в двоичном дереве
- 9. Глубина узла в двоичном дереве
- 10. вопросы о двоичном дереве поиска
- 11. Дубликаты в двоичном дереве поиска
- 12. Удаление в двоичном дереве поиска
- 13. Вставка в двоичном дереве поиска
- 14. Поиск в двоичном дереве поиска
- 15. Обновление родительского узла в двоичном дереве поиска в JAVA
- 16. Поиск узла в двоичном дереве поиска в java?
- 17. Вычисление вертикальной суммы в двоичном дереве
- 18. Повторяющиеся записи в двоичном дереве поиска
- 19. Как рассчитать глубину каждого узла в двоичном дереве поиска?
- 20. Как найти n-го предка узла в двоичном дереве поиска?
- 21. Глубина vs Расстояние в двоичном дереве поиска
- 22. Получение числа узлов в двоичном дереве поиска
- 23. Как разрешить дубликаты в двоичном дереве поиска?
- 24. Вопрос о двоичном дереве поиска?
- 25. Как найти элемент в двоичном дереве поиска?
- 26. Сегментация Неисправность «Вставка в двоичном дереве поиска». #
- 27. Найти родителя в двоичном дереве поиска?
- 28. Вставка узла в двоичном дереве в C
- 29. Удаление нескольких узлов в двоичном дереве поиска
- 30. Подсчет узлов в двоичном дереве поиска
Это великолепно! – Anant
Ваше решение прост и чист. Я попытался решить эту проблему, поддерживая учет всех детей на каждом узле. Это было сложным и склонным к ошибкам, гораздо проще просто сохранить размер левого поддерева, как и вы. Благодаря! – EngineeredBrain