0
Boas, I have an error in the Lookuppaid function, when I try to delete a value from the binary tree nothing happens and if I try to delete the root of the tree I get the following breakpoint:
Exception thrown: read access Violation.
root was 0xCCCCCC.
I make the code available here to anyone who wants to help me or to test it for you:
#include<stdio.h>
#include<stdlib.h>
#include<locale.h>
typedef struct tree *Arvore;
struct tree {
Arvore left;
Arvore right;
int *valor;
};
void DestruirNode(Arvore *raiz);
void ProcuraArvoreApaga(Arvore *raiz, int *value);
Arvore CriarArvore(int value) {
Arvore node;
if ((node = (Arvore)malloc(sizeof(struct tree))) == NULL) {
return NULL;
}
if ((node->valor = (int*)malloc(sizeof(int))) == NULL) {
return NULL;
}
*node->valor = value;
node->left = NULL;
node->right = NULL;
return node;
}
void DestruirArvore(Arvore *node) {
free((*node)->valor);
free(*node);
*node = NULL;
}
void Inserir(Arvore *raiz, int value) {
Arvore node = *raiz;
Arvore anterior = NULL;
if (*raiz == NULL) {
*raiz = CriarArvore(value);
return;
}
else {
while (node != NULL) {
anterior = node;
if (*node->valor > value) {
node = node->left;
}
else if (*node->valor < value) {
node = node->right;
}
else {
return;
}
}
if (*anterior->valor > value) {
anterior->left = CriarArvore(value);
}
else {
anterior->right = CriarArvore(value);
}
}
}
void ImprimirArvore(Arvore raiz, int nivel) {
int i;
if (raiz == NULL) {
for (i = 0; i < nivel; i++) {
printf("\t");
}
printf("*\n");
return;
}
ImprimirArvore(raiz->right, nivel + 1);
for (i = 0; i < nivel; i++) {
printf("\t");
}
printf("%d\n", *raiz->valor);
ImprimirArvore(raiz->left, nivel + 1);
}
Arvore Minimo(Arvore *raiz) {
Arvore node = *raiz;
while (node->left != NULL) {
node = node->left;
}
return node;
}
void DestruirNode(Arvore *raiz) {
Arvore node = *raiz;
if ((*raiz)->left == NULL && (*raiz)->right == NULL) {
DestruirArvore(raiz);
}
else if ((*raiz)->right == NULL) {
*raiz = (*raiz)->left;
DestruirArvore(raiz);
}
else {
*(*raiz)->valor = *Minimo((*raiz)->right)->valor;
ProcuraArvoreApaga(&(*raiz)->right, (*raiz)->valor);
}
}
void ProcuraArvoreApaga(Arvore *raiz, int *value) {
if (*raiz == NULL) {
return;
}
if (*(*raiz)->valor > *value) {
ProcuraArvoreApaga(&(*raiz)->right, value);
}
else if (*(*raiz)->valor < *value) {
ProcuraArvoreApaga(&(*raiz)->left, value);
}
else {
/*value = *(*raiz)->valor;*/
printf("%d", value);
DestruirNode(&raiz);
}
return 0;
}
int main(void) {
setlocale(LC_ALL, "Portuguese");
Arvore raiz = NULL;
int i = 0, escolha;
int value = NULL;
int var = NULL;
for (i = 1; i < 2; i++) {
printf("\t\tÁrvores binárias\n\n");
printf("Selecione a operação que deseja efetuar:\n");
printf("[1] Adicionar valor\n");
printf("[2] Vizualizar árvore\n");
printf("[3] Apagar valor/árvore\n");
printf("[4] Sair\n\n");
printf(">>");
scanf("%d", &escolha);
switch (escolha) {
case 1:
system("cls");
printf("Introduza o valor a adicionar à árvore:\n>>");
scanf("%d", &value);
Inserir(&raiz, value);// Adiciona na árvore
system("cls");
i = 0;
break;
case 2:
system("cls");
printf("\t\tVisualização da árvore\n\n");
ImprimirArvore(raiz, 10);// O 10 adiciona quantos níveis tem a árvore
i = 0;
break;
case 3:
system("cls");
printf("Introduza o valor que deseja apagar(um valor que não seja folha apagará os ramos e folhas abaixo dele):\n>>");
scanf("%d", &var);
ProcuraArvoreApaga(&raiz, &var);
system("cls");
i = 0;
break;
case 4:
break;
}
}
}
I use Visual Studio 2015
I didn’t fix the code, just questions. Why are you passing value by reference in the Paysafenet function? Why do you pass the address of a tree if tree is the address of a Tree struct (in other words root is a pointer pointer)? Another observation is that Destrurnode flame Procuraarvoreapaga and Procuraarvoreapaga flame Destrurnode.
– Gustavo Dambros