简体   繁体   中英

Remove nodes from a Binary Search Tree in C

I want to remove nodes from a binary search tree. In this function there are 3 parameters. One of them tree, the others are start node and end node. I want to remove nodes between start node and end node. PS : The user write start node and end node and we use them as parameters.

The code which I write :

node * removeReviewsBetween(node * tree,double start,double end){
    node * newNode;
    if(tree==NULL){
        return NULL;
    }


    if(start< tree->scoreNumber){
        tree->left=removeReviewsBetween(tree->left,start,end);
    }

    else if(start > tree->scoreNumber){
        tree->right=removeReviewsBetween(tree->right,start,end);
    }

    else{
        if(tree->right && tree->left){
            newNode=findMin(tree->right);
            tree->scoreNumber=newNode->scoreNumber;
            tree->right=removeReviewsBetween(tree->left,tree->scoreNumber,end);
        }

        else{
            newNode=tree;
            if(tree->left==NULL){
                tree=tree->right;
            }
            else if(tree->right==NULL){
                tree=tree->left;
            }
            free(newNode);
        }

        return tree;
    }
}

I write someting but it doens't work correctly. Please give me some advice

That should do it - your code slightly modified:

node *removeReviewsBetween(node *tree, double start, double end){
    node *newNode;
    double score;

    if(tree==NULL){
        return NULL;
    }

    while (tree->scoreNumber >= start && tree->scoreNumber =< end){  // if head is in the range to  delete
        if(tree->right){
            newNode = findMin(tree->right);
            score = newNode->scoreNumber;
            removeReviewsBetween(tree, score, score);
            tree->scoreNumber = score;
            continue;
        }

        if(tree->left){
            newNode = findMax(tree->left);
            score = newNode->scoreNumber;
            removeReviewsBetween(tree, score, score);
            tree->scoreNumber = score;
            continue;
        }

        return NULL;  // if the only node left is the head and it's still in the range to delete
    }

    if(end < tree->scoreNumber){  // if all nodes to delete are in the left subtree
        tree->left = removeReviewsBetween(tree->left, start, end);
        return tree;
    }

    else if(start > tree->scoreNumber){  // if all nodes to delete are in the right subtree
        tree->right = removeReviewsBetween(tree->right, start, end);
        return tree;
    }           
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM