I've seen the response from @pcccj and I agree with what it says, about returning the item , not just writing its value. There are a number of ways to do this, from a genius algorithm that manipulates the return of the search function with mastery to a simple algorithm but using the C tools.
As I'm not that smart, here's a simple algorithm;)
#include<stdio.h>
#include<stdlib.h>
// Declara o formato dos nodos da árvore, e cria o tipo
struct nodo {
int Elemento;
struct nodo *Esquerda;
struct nodo *Direita;
};
typedef struct nodo Nodo;
// Insere elementos na árvore
void InsereNodo(Nodo **raiz, Nodo *item) {
if (!*raiz) {
*raiz = item;
return;
}
if (item->Elemento < (*raiz)->Elemento)
InsereNodo(&(*raiz)->Esquerda, item);
else
InsereNodo(&(*raiz)->Direita, item);
}
// Escreve o valor de cada elemento da árvore, in-order
void ListarEmOrdem(Nodo *raiz){
if (raiz->Esquerda)
ListarEmOrdem(raiz->Esquerda);
printf("%d\n", raiz->Elemento);
if (raiz->Direita)
ListarEmOrdem(raiz->Direita);
}
// Percorre a árvore, por profundidade, parando ao encontrar o n-ésimo elemento
void ProcuraProfundidade(Nodo *raiz, int **posicao, int limite, Nodo **NodoEncontrado){
if (raiz->Esquerda)
ProcuraProfundidade(raiz->Esquerda, posicao, limite, NodoEncontrado);
if (!*NodoEncontrado){
if((**posicao)++ == limite){
*NodoEncontrado = raiz;
return;
}
if (raiz->Direita)
ProcuraProfundidade(raiz->Direita, posicao, limite, NodoEncontrado);
}
}
// Função intermediária de busca; mantém uma assinatura decente e lida com exceções
Nodo* Procura(Nodo *raiz, int posicao){
if (posicao < 1)
return NULL;
else if (!raiz)
return raiz;
else {
Nodo *NodoEncontrado = NULL;
int *inicial = malloc(sizeof(int));
*inicial = 1;
ProcuraProfundidade(raiz, &inicial, posicao, &NodoEncontrado);
return NodoEncontrado;
}
}
int main(int argc, char **argv){
Nodo *raiz, *atual;
int i;
raiz = NULL;
// Cria uma árvore de 7 elementos aleatórios
for (i = 0; i < 7; i++) {
atual = (Nodo*)malloc(sizeof(Nodo));
atual->Esquerda = atual->Direita = NULL;
atual->Elemento = rand();
InsereNodo(&raiz, atual);
}
// Escreve todos os elementos da árvore
printf("Lista de elementos\n----------\n");
ListarEmOrdem(raiz);
// Procura por todas as posições, de 0 a n+1, para cobrir pelo menos 2 casos de erro
printf("\n\nResultado das buscas\n----------\n");
for (i = 0; i <= 8; i++){
atual = Procura(raiz, i);
if (atual)
printf("%d: %d\n", i, atual->Elemento);
else
printf("%d: %p\n", i, atual);
}
return EXIT_SUCCESS;
}
Basically, the search works exactly the same as the writing function, but adds stop conditions to avoid fetching the entire tree when you reach the position you'd like.
For control, use 2 pointers so that each sub-call of the function controls the same values. This is the part where I exchange a genius algorithm for using language tools effectively. It works that's a wonder!
Ultimately, the end result is closer to what you would naturally imagine:
scroll through the tree
For each element add one to the counter
If the counter is equal to the position you want
return the element
If you want to know more about pointers: link