BST节点删除 - 实现伪代码

时间:2016-12-27 02:32:33

标签: c++ binary-search-tree

我有一个用于删除节点的非递归伪代码(目前没有2个子节点),我必须实现。一切似乎都没问题,除了我想要删除根的情况。

伪代码:

delete(root, key)
{
    parent = NULL;
    p = root; //p - node to delete

    while( (p != NULL) && (key != p->data) ) 
    {
        parent = p;

        if( p->data < key ) p = p->right;
        else p = p->left;
    }

    if( p == NULL ) return;

    if( (p->right == NULL) && (p->left == NULL) ) // deleted node p is a leaf
    {
        if(p == root)
        {
            root = NULL; // deleted leaf is a root
            return;
        }
    if( parent->right == p) parent->right = NULL;
    else parent->left = NULL;
    return;
    }

    if( p->right == NULL ) // p node to delete has only left subtree
    {
        if( parent->right == p ) parent->right = p->left;
        else parent->left = p->left;    
        return;
    }

    if( p->left == NULL ) // p node to delete has only right subtree
    {
        if( parent->right == p ) parent->right = p->right;
        else parent->left = p->right;    
        return;
    } 
}

这是我的实施:

struct BstNode
{
    int data;
    BstNode *left, *right;
};

void Remove(BstNode **root, int key)
{
    BstNode **parent, ***p; 
    parent=NULL;
    p=&root;

    while((**p!=NULL) && (key!=(**p)->data))
    {
        parent=&(**p);
        if((**p)->data < key) *p=&(**p)->right;
        else *p=&(**p)->left;
    }
    if((**p)==NULL)
    {
        cout << "no such element! " <<endl;
        return;
    }

    if(((**p)->right)==NULL && (**p)->left==NULL)  
    {
        if((**p)==*root)
        {

            *root=NULL;
            return;
        }

        if((*parent)->right==(**p))
            (*parent)->right = NULL;
        else (*parent)->left = NULL;
        return;
    }

    if(((**p)->right)==NULL )  
    {

        if((*parent)->right== (**p))
            (*parent)->right = (**p)->left;
        else
            (*parent)->left = (**p)->left;
        return;
    }
    if(((**p)->left)==NULL ) 
    {

        if((*parent)->right==(**p))
            (*parent)->right = (**p)->right;
        else
            (*parent)->left = (**p)->right;
        return;
    }
}

int main()
{

    BstNode* root = NULL;
    Insert(&root,2);
/* ... */
    Remove(&root,2);
}

我认为“父母”有问题,因为root没有父母。但是,我不知道如何找到解决这个问题的方法。

0 个答案:

没有答案