[我要实现的目标]
在AVL树中,我需要创建一个函数:
如果输入节点在AVL树中,它将被删除。但是,当输入节点不在AVL树中时,它必须将输入节点平方并推入。
[代码说明]
有几种功能可以实现。
我使用getBF
函数获得了AVL树的高度,以获取平衡因子,并在树变得不平衡时将其用于rebalance
。然后,我制作了doubleInsert
函数以使输入节点平方,并在deleteNodeDoubleInsert
函数中使用了该函数:我要实现的函数。它主要集中在删除节点上。当插入的节点在树中不存在时,使用“ doubleInsert”。
[我尝试过的方法]
当我仅单独使用doubleInsert
函数时,它就可以正常工作。另外,当我从doubleInsert
删除deleteNodeDoubleInsert
并替换为简单的return;
时,它也起作用。但是,当我将deleteNodeDoubleInsert
函数与doubleInsert
一起使用时,就像下面的代码一样,它不起作用,并且代码刚刚结束。可能是什么问题呢?
/*It squares the input node*/
treeNode *doubleInsert(treeNode **root, element x){
element xx= x*x;//square
if(*root== NULL){
*root= (treeNode *)malloc(sizeof(treeNode));
(*root)-> key= xx;
(*root)-> left= NULL;
(*root)-> right= NULL;
}
else if(xx< (*root)-> key){
(*root)-> left= insert_AVL_Node(&((*root)-> left), xx);
//treeNode *insert_AVL_Node(treeNode **root, element x)
//: it inserts the nodes to the AVL tree
*root= rebalance(root);
//`rebalance`function does
}
else if(xx> (*root)-> key){
(*root)-> right= insert_AVL_Node(&((*root)-> right), xx);
*root= rebalance(root);
}
else {
printf("\n이미 같은 키가 있습니다.\n");
}
return *root;
}
/* the function that I want to implement */
treeNode* deleteNodeDoubleInsert(treeNode *root, element key){
treeNode *parent, *p, *succ, *succ_parent;
treeNode *child;
parent= NULL;
p= root;
while((p != NULL) && (p-> key != key)){
parent= p;
if(key< p-> key) p= p-> left;
else p= p-> right;
}
//if there is no node existing
if(p== NULL){
doubleInsert(&root, key);
}
//when the node doesn't have any chlild
if((p-> left== NULL) && (p-> right== NULL)){
if(parent != NULL){
if(parent-> left== p) parent-> left= NULL;
else parent-> right= NULL;
}
}
//when the node has 1 child
else if((p-> left== NULL) || (p-> right== NULL)){
if (p-> left != NULL) child= p-> left;
else child= p-> right;
if(parent != NULL){
if(parent-> left== p) parent-> left= child;
else parent-> right= child;
}
//when the node is root
else root= child;
}
//when the node has 2 children
else {
succ_parent= p;
succ= p-> left; //p's left subTree
while (succ-> right != NULL){
succ_parent= succ;
succ= succ-> right;
}
//link succ_parent and succ child
if(succ_parent-> left== succ)
succ_parent-> left= succ-> left;
else succ_parent-> right= succ-> left;
//data swap to free p
p-> key= succ-> key;
p= succ;
}
free(p);
}
/*print AVL tree*/
void displayPreorder (treeNode *root) {
if (root) {
printf("%10d", root->key);
displayPreorder(root->left);
displayPreorder(root->right);
}
}
int main(){
deleteNodeDoubleInsert(root_AVL, userData);
printf("AVL 트리: ");
displayPreorder(root_AVL);//
}