如果只查找最小,最大元素,使用最小最大堆更好。如果还要查找比x更大一点的元素,或者比x更小一点的元素,或者经常做从小到大的遍历(DWR框架就是这种应用场景),TreeMap更好
final Entry<K,V> getHigherEntry(K key) {
Entry<K,V> p = root;
while (p != null) {
int cmp = compare(key, p.key);
//如果key<p.key,向左子树查找满足key<x<p.key的结点,
//假如左子树为空,表示p.key刚刚比key大,p就是x,查找结束。返回这个p.
//假如不为空,就遍历这个左子树
if (cmp < 0) {
if (p.left != null)
p = p.left;
else
return p;
} else {
//如果key>p.key,比key大的在p的右子树中,
//假如右子树不为空,继续向右子树遍历
//如果右子树为空,则说明右子树已经没有满足p.key<key<x.key的节点x.
//这个时候,只能从p的父节点开始向上追溯,找到第一个满足key<x.key的父节点x,p必然属于这个父节点的左子树
if (p.right != null) {
p = p.right;
} else {
Entry<K,V> parent = p.parent;
Entry<K,V> ch = p;
while (parent != null && ch == parent.right) {
ch = parent;
parent = parent.parent;
}
return parent;
}
}
}
return null;
}