Как я могу заставить функцию печатать квадрат входного значения?(DataStructure, AVL дерево) - PullRequest
1 голос
/ 03 июня 2019

[что я хочу реализовать]
В дереве 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);//
        }
...