Árvore binária de busca, algoritmos de inserção, caminhamento e busca explicados
Publicado por Perfil removido (última atualização em 14/03/2010)
[ Hits: 37.164 ]
Olá pessoal! Comecei a brincar com árvores em C e acabei de construir algumas rotinas. Comentei cada rotina.
Espero que seja útil pra alguém.
Grande abraço!
#include <stdio.h>
#include <string.h>
#include <malloc.h>
/*Declaração do nó para a árvore, composto de ponteiros
da direita e esquerda e de um campo para dado que no caso
é o campo char dado[30];
*/
struct no {
char dado[30];
struct no *direita;
struct no *esquerda;
};
struct no *raiz; //Ponteiro da raiz
struct no *alocar; //Ponteiro para fazer alocação
/*Rotina de busca
Insere o dado em string e ela retorna o ponteiro em hexa
para a região da memória para o qual o ponteiro está
apontando.
*/
struct no * buscar(char *dado) {
struct no *ponteiro;
ponteiro = raiz;
while (ponteiro) {
if (strcmp(dado, ponteiro->dado)==0) //Faz a comparação de strings
return ponteiro; //Retorna ponteiro se o encontrar
if (strcmp(dado, ponteiro->dado)>0)
ponteiro = ponteiro->direita;
else
ponteiro = ponteiro->esquerda;
}
return NULL; //Retorna o ponteiro nulo
}
/*Rotina que faz a inserção na árvore binária de busca
O Parâmetro dado recebe um ponteiro para string
A função não retorna valor nem referência
*/
void inserir(char *dado) {
alocar = (struct no *) malloc(sizeof(struct no)); //Faz alocação na memória
if (!alocar) { //Se não for possível a alocação, sai do programa
printf("Falta de memória");
exit(0);
}
strcpy(alocar->dado, dado); //Copia o dado para o novo nó alocado
if (!raiz) { //Se não houver elemento ainda na árvore, insere na raiz
raiz = alocar;
}
else //se não...
{
//ponteiros para busca
struct no *ponteiro;
struct no *ponteiroAnterior;
ponteiro = raiz; //ponteiro inicia na raiz
ponteiroAnterior = NULL; //anterior inicial em NULL
while (ponteiro) { //Faz a busca do lugar ao qual deve ser inserido o nó
ponteiroAnterior = ponteiro;
if (strcmp(dado, ponteiro->dado)==0) {
printf("\nDado inserido já existe!");
return;
}
if (strcmp(dado, ponteiro->dado)>0){
ponteiro = ponteiro->direita;
}
else {
ponteiro = ponteiro->esquerda;
}
}
if (strcmp(dado, ponteiroAnterior->dado)>0) {
ponteiroAnterior->direita = alocar;
//atribui o endereço de alocação ao ponteiro da direita do nó anterior
}
else {
ponteiroAnterior->esquerda = alocar;
//atribui o endereço de alocação ao ponteiro da esquerda do nó anterior
}
}
}
/*Faz o caminhamento em ordem recursivamente*/
void caminharEmOrdem(struct no *ponteiro) {
if (ponteiro) {
caminharEmOrdem(ponteiro->esquerda);
printf("\n%s", ponteiro->dado);
caminharEmOrdem(ponteiro->direita);
}
}
/*Rotina principal
com algumas inserções, um caminhamento e uma busca no final
*/
int main() {
char dado[30];
printf("\nInserir: ");
gets(dado);
inserir(dado);
printf("\nInserir: ");
gets(dado);
inserir(dado);
printf("\nInserir: ");
gets(dado);
inserir(dado);
printf("\nInserir: ");
gets(dado);
inserir(dado);
caminharEmOrdem(raiz);
printf("\nInserir para buscar: ");
gets(dado);
printf("%p", buscar(dado));
getchar();
}
Utilizando ESTRUTURA DE DADOS (REGISTRO) - abordagem simples e rápida
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como implementar Raid (0, 1, 5, 6, 10 e 50)
fusermount3 no Ubuntu 25.10 - mantenha o perfil do AppArmor
[Resolvido] dlopen(): error loading libfuse.so.2 AppImages require FUSE to run.
Criação de diretórios e aplicação de restrições de acesso no Linux
Tem como instalar o Untapped no Linux? [RESOLVIDO] (3)
Servidor Ubuntu 24.04 HD 500 não tenho espaço na \home\adminis... (0)
Servidor de DNS BIND Ubuntu server (4)
Como programar um sistema de controle para distribuições linux em c? (2)









