繁体   English   中英

从C中的二叉搜索树中删除节点

[英]Remove nodes from a Binary Search Tree in C

我想从二叉搜索树中删除节点。 此功能有3个参数。 其中一个树,其他树是开始节点和结束节点。 我想删除起始节点和结束节点之间的节点。 PS:用户写入起始节点和结束节点,我们将它们用作参数。

我写的代码:

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;
    }
}

我写东西,但不能正常工作。 请给我一些建议

那应该做到—您的代码稍作修改:

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;
    }           
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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