最近,我正在学习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的节点。有人能告诉我进度吗?谢谢。 而且,令我困惑的是代码:[else x = right(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 :(得分:0)
在红黑树和所有二进制搜索树中,任何节点的子节点都少,右子节点大于节点。要查找带密钥的节点,我们首先将密钥与根节点进行比较。如果它比root的关键更大,那么我们去root的右边孩子并比较它的关键,否则我们去左边的孩子。因此,我们可以通过访问节点90
找到30->60->70->85->90
。由于RB树的高度最多为2log(n+1)
,我们可以在O(log(n))
时间内找到n
为节点数的任何节点。