zoukankan      html  css  js  c++  java
  • 二叉查找树中元素的删除操作

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

  • 相关阅读:
    [1] Tornado Todo Day0
    [0] Tornado Todo 开篇
    RNSS和RDSS
    国密随机数检测--2/15 块内频数检测
    国密随机数检测--1/15 单比特频数检测
    FPGA实用通信协议之IIC
    压缩感知(十)
    压缩感知(九)
    压缩感知(八)
    压缩感知(七)
  • 原文地址:https://www.cnblogs.com/bestwangjie/p/5645306.html
Copyright © 2011-2022 走看看