Que tal esse procedimento (funciona apenas para BSTs estáticos).
Em cada nó, você mantém um ponteiro para outro nó, que existe na subárvore enraizada nesse nó. Junto com o ponteiro, você também mantém o número do nível do nó que está sendo apontado (junto com o número do seu nível). A raiz está no nível 0 e os níveis aumentam à medida que você desce pela árvore. Inicialmente, o ponteiro de um nó aponta para o próprio nó. A invariante é que você sempre apontará para um nó em um nível inferior ou igual ao número do nível do nó.
Quando você procura um elemento na árvore, ele:
1. Be found at its location in the BST, or
2. Be found along a path to its location because some node along the node to root path has a pointer to this node, or
3. Not be found at all.
Em ambos os casos, primeiro fazemos um encaminhamento para encontrar o nó e, se for encontrado, fazemos bolhas nos nós apontados ao longo do caminho raiz para o nó do nó encontrado. Se o nó foi encontrado como resultado do caso-2, apenas fazemos bolhas até o nó que estava apontando para o nó de destino (isso nos permite ser rápidos nos nós acessados recentemente).
Se um nó for alterado para um nível maior que o próprio, excluímos o nó do conjunto de mapeamento.
Se um nó que não possui mapeamento for acessado, criamos um novo mapeamento para esse nó e o configuramos para substituir o mapeamento existente no nó e realizamos a bolha progressivamente.
Quando um nó é acessado, ele é borbulhado até o topo.