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); }
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; }