Árvores binárias em C são uma excelente forma de organizar dados dinamicamente para buscas eficientes. No entanto, exigem bastante trabalho para manutenção.
Toda árvore binária precisa de uma estrutura, mesmo que tenha apenas uma variável. Escolha um nome e use typedef para criá-la:
typedef struct student_data STUDENT_DATA;
Inclua dois ponteiros para a mesma estrutura:
struct student_data {
int student_ID;
int student_grade;
STUDENT_DATA *left, *right;
};
Aloque um ponteiro para esta estrutura de dados, inicializando-o como NULL, para ser a cabeça da árvore:
STUDENT_DATA *students = NULL;
STUDENT_DATA *new_student, *cur_student;
if ((new_student = malloc(sizeof(STUDENT_DATA))) == NULL) {
abort();
}
new_student->student_ID = newID;
new_student->student_grade = newgrade;
new_student->left = NULL;
new_student->right = NULL;
if (!students) {
students = new_student;
return;
}
cur_student = students;
while (cur_student) {
if (newID == cur_student->student_ID) {
abort();
}
if (newID < cur_student->student_ID) {
if (cur_student->left == NULL) {
cur_student->left = new_student;
return 1;
}
cur_student = cur_student->left;
}
} else {
if (cur_student->right == NULL) {
cur_student->right = new_student;
return 1;
}
cur_student = cur_student->right;
}
STUDENT_DATA *cur_student;
cur_student = students_head;
while (cur_student) {
if (cur_student->student_ID == 15) {
return cur_student->student_grade;
}
if (cur_student->student_ID < 15) {
cur_student = cur_student->right;
} else {
cur_student = cur_student->left;
}
}
return 0;
Desaloque a árvore binária quando o programa terminar, pois nem todos os sistemas operacionais fazem isso automaticamente. Use uma função recursiva:
void deallocate_binary_tree(STUDENT_DATA *tree) {
if (!tree) return;
deallocate_binary_tree(tree->left);
deallocate_binary_tree(tree->right);
free(tree);
}
Busca e inserção em árvores binárias também podem ser feitas usando recursão. Isso torna o código mais fácil de escrever e manter, embora um pouco mais difícil de entender até você se acostumar. É comum criar uma árvore binária que contenha apenas ponteiros para uma segunda estrutura de dados em C, geralmente um array ou lista encadeada, onde os dados reais residem. Cada árvore binária atua como um índice para buscar rapidamente um único campo dos dados da lista.
Excluir um nó de uma árvore binária é um algoritmo muito complexo em C, mas em muitos usos de árvores binárias, os elementos nunca são excluídos.
Tecnologia Eletrônica © [www.351231.com]