SearchDelete(ProcuraArvoreApaga)函数断点

时间:2017-06-26 15:35:18

标签: c visual-studio binary-tree binary-search-tree breakpoints

我在函数ProcuraArvoreApaga上有一个问题,它是一个TreeSearchDelete函数。我无法删除任何内容,当我尝试删除root时,它会给我一个断点。 当我尝试删除根时,我得到了以下断点:

抛出异常:读取访问冲突。

raiz是0xCCCCCCCC。

如果您想亲自尝试或帮助我,请输入完整的代码。 我使用Visual Studio 2015

#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;
        }
    }
}

0 个答案:

没有答案