Linguagem C - Árvores Binárias
Neste artigo, falarei sobre o que é e como implementar uma estrutura de dados chamada Árvore Binária. Com tempos de pesquisa, inserção e remoção expressivamente melhores que de listas encadeadas, esta estrutura é usada principalmente em bancos de dados e sistemas de arquivos.
[ Hits: 53.355 ]
Por: Enzo de Brito Ferber em 07/05/2015 | Blog: http://www.maximasonorizacao.com.br
Inserir(elemento) {
Se (elemento <= raiz) Inserir (arvore esquerda)
Senão Inserir (arquivo direita)
}
typedef struct folha* Folha;
struct folha {
int info;
Folha esquerda;
Folha direita;
};
/* @ Folha inserir (Folha raiz, int info)
*
* Argumentos
* ----------
* raiz ponteiro para 'struct folha', estrutura de dado básica para
* construção da árvore
* info nova informação a ser inserida
*
* Retorno
* -------
* NULL em caso de erro
* Folha em caso de sucesso (nó 'raiz')
*/
Folha inserir (Folha raiz, int info)
{
if (!raiz) {
/* significa que o ponteiro é nulo, e que está é a posição
* para inserção.
*
* 1. Alocar e checar memória
*/
if (!(raiz = FOLHA)) {
perror("inserir:malloc()");
return NULL;
}
/* 2. Cópia da Informação
* 3. Ponteiros de referência
* 4. Retorno da nova folha
*/
raiz->info = info;
raiz->esquerda = raiz->direita = NULL;
return raiz;
} else if (info > raiz->info)
raiz->direita = inserir (raiz->direita, info);
else
raiz->esquerda = inserir (raiz->esquerda, info);
/* retorna o ponteiro raiz
*
* Isso é necessário pois a função inserir é recursiva, e seu retorno
* é sempre atribuido ao mesmo ponteiro passado como argumento 'raiz',
*
* raiz->esquerda = inserir(raiz->esquerda,info)
* raiz->direita = inserir(raiz->direta, info)
*/
return raiz;
}
Folha arvore = NULL; arvore = inserir(arvore, 4); ... // as chamadas subsequentes a inserir serão: inserir (arvore, 4);
Folha inserir (Folha raiz, int info)
if (!raiz) {
/* significa que o ponteiro é nulo, e que está é a posição
* para inserção.
*
* 1. Alocar e checar memória
*/
if (!(raiz = (Folha) malloc (sizeof(struct folha)))) {
perror("inserir:malloc()");
return NULL;
}
/* 2. Cópia da Informação
* 3. Ponteiros de referência
* 4. Retorno da nova folha
*/
raiz->info = info;
raiz->esquerda = raiz->direita = NULL;
return raiz;
}
else if (info > raiz->info) raiz->direita = inserir (raiz->direita, info); else raiz->esquerda = inserir (raiz->esquerda, info); return raiz;
raiz->direita = inserir (raiz->direita, info);
raiz->esquerda = inserir (raiz->esquerda, info);
Linguagem C - Funções Variádicas
Linguagem C - Listas Duplamente Encadeadas
Linguagem C - Listas Duplamente Encadeadas
Análise dos Métodos de Ordenação usados em Algoritmos Computacionais
Guia de Programação em C/GTK 2 - Construindo uma Calculadora Completa
Dicas para aprender programação
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 automatizar sua instalação do Ubuntu para desenvolvimento de software.
Consertando o áudio com estalos e interrupções no Pipewire
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.
REDE WI-FI NÃO APARECE NO LINUX MINT (0)
Como programar um sistema de controle para distribuições linux em c? (5)
Servidor Ubuntu 24.04 HD 500 não tenho espaço na \home\adminis... (2)









