C 通过AVL树中的指针忽略操作
我正在使用以下结构构建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
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;
}