C++ 在C+中为二叉搜索树生成删除函数+;

C++ 在C+中为二叉搜索树生成删除函数+;,c++,performance,recursion,binary-search-tree,C++,Performance,Recursion,Binary Search Tree,编辑*:我正在为二叉搜索树编写删除函数。我现在正在处理第一个案子。我认为这是正确的,但我想知道它是否可以递归地完成,或者更有效地完成。感谢您的帮助。假设BSTSearch搜索一个节点,isLeaf如果该节点是一个叶,则返回true,并且每个节点都有一个允许其访问其父节点的指针 void BinarySearchTree::BSTDelete(int x, BSTNode *node){ BSTNode *deleteNode; deleteNode = BSTSearch(x,

编辑*:我正在为二叉搜索树编写删除函数。我现在正在处理第一个案子。我认为这是正确的,但我想知道它是否可以递归地完成,或者更有效地完成。感谢您的帮助。假设BSTSearch搜索一个节点,
isLeaf
如果该节点是一个叶,则返回true,并且每个节点都有一个允许其访问其父节点的指针

void
BinarySearchTree::BSTDelete(int x, BSTNode *node){

    BSTNode *deleteNode;
    deleteNode = BSTSearch(x,node); 

    if(isLeaf(deleteNode)){

        if(deleteNode->sortkey > (deleteNode->parent)->sortkey){
             delete (deleteNode->parent)->right;
            (deleteNode->parent)->right = NULL;
        }

        else{
            delete (deleteNode->parent)->left;
            (deleteNode->parent)->left = NULL;  
        }
    }

您不需要指向父对象的指针。这里是一个递归版本,应该可以工作:(如果您不知道,通过引用传递(
&
),允许您修改变量,类似于通过指针传递;
BSTNode*&
是通过引用传递的指针,因此我们可以修改node->left/right(指针)的值(不仅仅是指针所指向的值))

void二进制搜索树::BSTDelete(int x,BSTNode*&node)
{
if(node==NULL)
返回;
如果(x==节点->排序键)
{
if(isLeaf(节点))
{
删除节点;
node=NULL;
}
其他的
{
//其他东西在这里
}
返回;
}
else if(xsortKey)
BSTDelete(x,节点->左侧);
其他的
BSTDelete(x,节点->右侧);
}

从树中删除可能是一项困难的操作。考虑你需要知道你正在删除的节点的父节点,这样你就可以更新当前在你感兴趣的节点上指向的子指针。然后考虑在哪里放置当前节点的(可能不止一个)的子节点,而不违反任何可能的约束约束(BST肯定是这样的)。在某些情况下,您可能需要从树的根开始重新平衡事物……“高效”是一个相对的术语,已经研究了各种二进制搜索树,每个树都有自己的优缺点。查看AVL、红黑、八字、树丛、探戈等树…这看起来不正确。您正在删除
deleteNode
,然后访问它以将其父节点中的指针设置为NULL。您应该将这些行更改为
deleteNode->parent->right=NULL;删除删除节点
void BinarySearchTree::BSTDelete(int x, BSTNode *&node)
{
   if (node == NULL)
      return;
   if (x == node->sortKey)
   {
      if (isLeaf(node))
      {
         delete node;
         node = NULL;
      }
      else
      {
         // other stuff goes here
      }
      return;
   }
   else if (x < node->sortKey)
      BSTDelete(x, node->left);
   else
      BSTDelete(x, node->right);
}