Use os arquivos arvore.h, mapa.h, mapa_abb.c e teste_abb.c para fazer essa parte dos exercícios. (Ou use a sua implementação de árvores binárias de busca.)
void mostra_chaves_decrescentes (Mapa *m);
Uma ideia é usar uma função interna e_abbr, com dois parâmetros, min e max, que indicam os valores mínimo e máximo permitidos na subárvore a ser visitada em cada chamada recursiva.
static int e_abbr (Mapa *m, int min, int max); /* INT_MIN e INT_MAX são, resperctivamente, o menor e o maior inteiro representáveis na máquina utilizada */ int e_abb(Mapa *m) { return e_abbr(m, INT_MIN, INT_MAX); }
Novamente, a ideia é usar uma função interna, chavek_rec. Essa função recebe mais um parâmetro, um ponteiro para uma variável que que indica a "ordem" da última chave encontrada. Note que, quando esse valor chegar a k, você já tem a chave procurada.
Dica: Repare que a k_ésima menor chave pode estar na subárvore esquerda ou na subárvore direita de um nó! (Desenhe uma árvore com alguns nós e experimente...)
static int chavek_rec(Mapa *m, int k, int *ordem); int chavek (Mapa* m, int k) { int ordem = 0; int chave = chavek_rec(m, k, &ordem); if (ordem < k) return -1; return chave; }
int altura_iter (Mapa *m);
Repare que a função mostra foi alterada para mostrar também esse campo, assim você pode usar o programa de teste para verificar se o valor está correto para todos os nós da árvore criada.