我偶然发现了SGI的STL地图implementation(stl_map.h),并且它有一段用于查找项目的代码:
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 = _M_header; // Last node which is not less than __k.
_Link_type __x = _M_root(); // Current node.
while (__x != 0)
if (!_M_key_compare(_S_key(__x), __k))
__y = __x, __x = _S_left(__x);
else
__x = _S_right(__x);
iterator __j = iterator(__y);
return (__j == end() || _M_key_compare(__k, _S_key(__j._M_node))) ?
end() : __j;
}
我一定是读错了,但在我看来它总是穿越整棵树。为什么一旦找到想要的密钥就不会停止?有人可以向我解释它是如何工作的吗?
我原本预计,在红黑树的情况下,首先要找出一个项目的密钥是否与搜索到的密钥相同,如果没有,则一步向左或向右。上面的代码似乎没有执行第一次检查。
编辑:例如,我想在下面的树中找到键“4”:
4
/ \
2 6
/ \ / \
1 3 5 7
我认为NULL只在叶子上。?