C 通过AVL树中的指针忽略操作

C 通过AVL树中的指针忽略操作,c,C,我正在使用以下结构构建AVL树: typedef struct node* nodep; typedef struct node { int postal_number; int h; /* height */ nodep left, right, parent; } Node; 一切都很好:旋转、搜索和插入。问题在于删除节点。它删除了大部分节点,除了删除了大部分树后的少数叶子。我的删除代码(有问题的部分)是: 我这样做的(*父节点)将是树中的节点本身,当调试它进入if

我正在使用以下结构构建AVL树:

typedef struct node* nodep;
typedef struct node {
    int postal_number;
    int h; /* height */
    nodep left, right, parent;
} Node;
一切都很好:旋转、搜索和插入。问题在于删除节点。它删除了大部分节点,除了删除了大部分树后的少数叶子。我的删除代码(有问题的部分)是:

我这样做的
(*父节点)
将是树中的节点本身,当调试它进入
if
时,它的行为就像它删除了一样(使节点的子节点成为节点父节点的子节点-我现在不处理
malloc
),但它就是不这样做。父节点一直指向我要删除的节点,而不是NULL

第一次删除的所有其余部分(节点和叶子)都可以使用这种语法


有人知道我遗漏了什么吗?

the_parent=&(to_delete->parent)
根节点是否有父节点?为什么将
父节点设置为指向
nodep
的指针?在您的代码中似乎没有必要,因为根节点的父节点为NULL。我试图删除的假期有一个父亲。父亲的右孩子或左孩子不会变成空的。而你是对的,这是不必要的。即使在他刚刚打盹的时候,它也不起作用。
int delete_postal(nodep* t, int in_postal){
    nodep to_delete;
    nodep* the_parent;

    to_delete = search_postal((*t), in_postal);
    the_parent = &(to_delete->parent);

    /** if the node we want to delete is a leave **/

    if (to_delete->right == NULL && to_delete->left == NULL) {
        if (to_delete == (*the_parent)->right){ /* the node we want to delete is right son */
            (*the_parent)->right = to_delete->right;
        else { /* the node we want to delete is left son */
            (*the_parent)->left = to_delete->left;
    }