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

Posted Learn++

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉查找树中元素的删除操作相关的知识,希望对你有一定的参考价值。

关于二叉查找树的建立,插入,遍历(记住二叉查找树的中序遍历是所有元素由大到小排序结果)等操作,博主“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,欢迎指正。

以上是关于二叉查找树中元素的删除操作的主要内容,如果未能解决你的问题,请参考以下文章

二叉树中的查找操作(按值查找按位查找)

230. 二叉搜索树中第K小的元素

二叉搜索树

《算法导论》读书笔记

LeetCode——230. 二叉搜索树中第K小的元素

20172325 2018-2019-2 《Java程序设计》第七周学习总结