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.