SplayNode SplayTreeNext(SplayTree tree, SplayNode oldNode, void *oldKey) {
    Bool b;
    SplayNode node;

    AVERT(SplayTree, tree);
    AVERT(SplayNode, oldNode);

    /* Make old node the root.  Probably already is. */
    b = SplaySplay(&node, tree, oldKey, tree->compare);
    AVER(b);
    AVER(node == oldNode);

    return SplayTreeSuccessor(tree, oldKey);
}
Exemplo n.º 2
0
Tree SplayTreeNext(SplayTree splay, TreeKey oldKey) {
  AVERT(SplayTree, splay);

  if (SplayTreeIsEmpty(splay))
    return TreeEMPTY;
  
  /* Make old node the root.  Probably already is.  We don't mind if the
     node has been deleted, or replaced by a node with the same key. */
  switch (SplaySplay(splay, oldKey, splay->compare)) {
  default:
    NOTREACHED;
    /* defensive fall-through */
  case CompareLESS:
    return SplayTreeRoot(splay);

  case CompareGREATER:
  case CompareEQUAL:
    return SplayTreeSuccessor(splay);
  }
}
Res SplayTreeNeighbours(SplayNode *leftReturn, SplayNode *rightReturn,
                        SplayTree tree, void *key) {
    SplayNode neighbour;

    AVERT(SplayTree, tree);
    AVER(leftReturn != NULL);
    AVER(rightReturn != NULL);

    if (SplaySplay(&neighbour, tree, key, tree->compare)) {
        return ResFAIL;
    } else if (neighbour == NULL) {
        *leftReturn = *rightReturn = NULL;
    } else {
        switch(SplayCompare(tree, key, neighbour)) {

        case CompareLESS: {
            *rightReturn = neighbour;
            *leftReturn = SplayTreePredecessor(tree, key);
        }
        break;

        case CompareGREATER: {
            *leftReturn = neighbour;
            *rightReturn = SplayTreeSuccessor(tree, key);
        }
        break;

        case CompareEQUAL:
        default: {
            NOTREACHED;
        }
        break;
        }
    }
    return ResOK;
}