R-B树如何在SGI STL中实现功能?

时间:2014-04-27 06:37:17

标签: c++ stl find binary-tree red-black-tree

最近,我正在学习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;
}

一个例子, The pictue shows one R-B tree

我想找到值为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;

1 个答案:

答案 0 :(得分:0)

在红黑树和所有二进制搜索树中,任何节点的子节点都少,右子节点大于节点。要查找带密钥的节点,我们首先将密钥与根节点进行比较。如果它比root的关键更大,那么我们去root的右边孩子并比较它的关键,否则我们去左边的孩子。因此,我们可以通过访问节点90找到30->60->70->85->90。由于RB树的高度最多为2log(n+1),我们可以在O(log(n))时间内找到n为节点数的任何节点。