[что я хочу реализовать]
В дереве AVL мне нужно сделать функцию:
Если входной узел находится в дереве AVL, он будет удален. Однако, когда входной узел не находится в дереве AVL, он должен выровнять входной узел и толкнуть его.
[код описания]
Для этого есть несколько функций.
Я получил высоту дерева AVL с помощью функции getBF
, чтобы получить коэффициент баланса, и использовал его до 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);//
}