- 一个节点的前驱节点是其左子树中的最大值,若无左子树,其前驱节点在从根节点到key的路径上,比key小的最大值。
- 一个节点的后继节点是右子树的最小值,若无右子树,其后继节点在从根节点到key的路径上,比key大的最小值。
代码实现:
- 如果key所在的节点不存在,则key没有前驱, 返回NULL
- 如果key所在的节点左子树不为空,则其左子树的最大值为key的前驱
- 否则,key的前驱在从根节点到key的路径上,在这个路径上寻找到比key小的最大值, 即为key的前驱
以前驱为例
public Key predecessor(Key key){
Node node = search(root, key);
//不存在
if(node == null) return null;
//左子树不存在
if(node.left == null)
return maximun(node.left).key;
//否则,key前驱在根节点到key的路径上
Node preNode = predecessorFromAncestor(root, key);
return preNode == null ? null : preNode.key;
}
Node predecessorFromAncestor(Node node, Key key){
if(node.key.compareTo(key) == 0)
return null;
if(key.compareTo(node.key) < 0)
// 如果当前节点大于key, 则当前节点不可能是比key小的最大值
// 向下搜索到的结果直接返回
return predecessorFromAncestor(node.left, key);
else{
assert key.compareTo(node.key) > 0;
// 如果当前节点小于key, 则当前节点有可能是比key小的最大值
// 向右继续搜索, 将结果存储到tempNode中
Node tempNode = predecessorFromAncestor(node.right, key);
if(tempNode != null)
return tempNode;
else
// 如果tempNode为空, 则当前节点即为结果
return node;
}
}