Как функция поиска дерева R-B реализуется в SGI STL?

Недавно я изучал исходный код SGI STL. когда я читаю функцию поиска дерева R-B, я не могу понять ее код. Сначала вставьте код, и есть пример, кто-нибудь может объяснить прогресс поиска? Благодарю.

template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator
rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::find(const Key& k) {
link_type y = header;        // Last node which is not less than k.
link_type x = root();        // Current node.

while (x != 0)
if (!key_compare(key(x), k))
y = x, x = left(x); //value of x is bigger than k
else
x = right(x); //value of x is less than k

iterator j = iterator(y);
return (j == end() || key_compare(k, key(j.node))) ? end() : j;
}

Один пример,
На рисунке изображено одно дерево R-B

Я хочу найти узел со значениями 70 и 90. Может ли кто-нибудь показать мне прогресс? Благодарю.
И что меня смутило, так это код: [иначе x = право (x); и заявление о возврате.

Спасибо, я получил этот ответ. решаемая, Я приведу пример, чтобы найти 70.

First, [x=root()=30, y=header], 30<70, so [x=x->right=60];
Second, 60<70:[x=x->right=70];
Then, 70>=70, so[ y=x=70, x = x->left=65];
last, 65<70:[x=x->right=NULL];
iterator j = iterator(y);
return j;

0

Решение

В красно-черных деревьях и во всех деревьях двоичного поиска левый дочерний элемент любого узла меньше, а правый дочерний элемент больше, чем узел. Чтобы найти узел с ключом, мы сначала сравниваем ключ с корневым узлом. Если он больше ключа root, мы идем к правому потомку root и сравниваем ключ с ним, в противном случае мы идем к левому потомку. Таким образом, мы можем найти 90 посещая узлы 30->60->70->85->90, Так как высота дерева РБ не более 2log(n+1) мы можем найти любой узел в O(log(n)) время где n это количество узлов.

0

Другие решения


По вопросам рекламы [email protected]