二叉查找树中元素的删除操作

关于二叉查找树的建立,插入,遍历(记住二叉查找树的中序遍历是所有元素由大到小排序结果)等操作,博主“C小加”写的很详细了,我主要补充BST的删除操作。删除操作主要难在对左右子节点都非空的节点的删除操作,这里可以找到该节点右节点中的最小值,即右子节点中的最左子树。找到后和需要删除的节点交换data等数据,然后删除这个最小子节点。实现代码如下,只需对需要删除节点的右子节点遍历一次:

template<class T>
void BST<T>::Deletepri(TreeNode<T> *&node, T x)
{
    if(node == NULL)
        return;
    if(x > node->data)
    {
        Deletepri(node->rson, x);
    }
    else if(x < node->data)
    {
        Deletepri(node->lson, x);
    }
    else
    {
        if(node->lson!=NULL && node->rson!=NULL)
        {
            TreeNode<T> *temp = node->rson;
            TreeNode<T> *pre_node= NULL;
            TreeNode<T> *temp_node= NULL;
            while(temp->lson != NULL)
            {
            
                pre_node = temp;
                temp = temp->lson;
            }
            node->data = temp->data;
            node->freq = temp->freq;
            temp_node = temp->rson;
            delete temp;
            if(pre_node != NULL)
            {
                pre_node->lson = temp_node;
            }
            return;
        }
        else
        {
            TreeNode<T> *temp = node;
            if(node->lson == NULL)
                node = node->rson;
            if(node->rson == NULL)
                node = node->lson;
            delete temp;
        }
    }
    return ;
}
template<class T>
void BST<T>::Delete(T x)
{
    Deletepri(root, x);
}

代码没有进行很多测试,应该有bug,欢迎指正。

原文地址:https://www.cnblogs.com/bestwangjie/p/5645306.html