从二叉树中删除节点没有父访问权限

时间:2013-04-02 15:55:06

标签: c++ binary-tree parent

我正在做一个类项目,我们从二叉树中“删除”一个节点而无法访问父节点或根节点。我们这样做的方式就是用树上的下一个节点覆盖旧节点。我遇到的问题是当它是树中的最后一个节点(它之后没有向右或向左)时我不能用下一个节点覆盖它,所以我删除了它,留下了一个空指针。我尝试只使值0(或null),但它抛出一个错误,说值不能为空。如果你知道如何做到这一点,你的建议将不胜感激。

template< typename T >
inline void Node< T >::delete_node( Node< T > *&p )
{
    cerr<< "delete node" << endl;
    if(p->left() == 0 && p->right() == 0)
    {
        delete p;
    }
    else if (p->left() == 0)//delete p and make the parent point to the right
    {
        //delete p;
        Node< T > *right = p->right();
        p->value(right->value());
        p->left(right->left());
        p->right(right->right());
    }
    else if (p->right() == 0)//delete p ad make the parent move to the left
    {
        //delete p;
        Node< T > *left = p->left();
        p->value(left->value());
        p->left(left->left());
        p->right(left->right());
    }
    else //delete p and go to the right then all the way to the left and attach the other side there.
    {
        Node< T > *tmp = p->left();
        Node< T > *find = p->right();
        Node< T > *right = p->right();

        while(find->left() != 0)
        {
            find = find->left();
        }
        find->left(tmp);

        p->value(right->value());
        p->right(right->right());
        p->left(right->left());
    }
}

0 个答案:

没有答案