如何使函数打印输入值的平方? (DataStructure,AVL树)

时间:2019-06-03 12:51:41

标签: c data-structures avl-tree

[我要实现的目标]
在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);//
        }

0 个答案:

没有答案