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