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

关于二叉查找树的建立,插入,遍历(记住二叉查找树的中序遍历是所有元素由大到小排序结果)等操作,博主“C小加”写的很详细了,我主要补充二叉树的删除操作。删除操作主要难在对左右子节点都非空的节点的删除操作,这里可以找到该节点右节点中的最小值,即右子节点中的最左子树。找到后和需要删除的节点交换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;
            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,欢迎指正。

时间: 2024-10-08 10:29:30

二叉查找树中元素的删除操作的相关文章

ADF中VO的删除操作初探

在ADF的VO中,真实提交更改是在commit 方法执行之后,如以下增加操作 EntityDefImpl departmentEODef = DepartmentEOImpl. getDefinitionObject(); //Create the entiy instance in the current transaction DepartmentEOImpl newDept1 = (DepartmentEOImpl)departmentEODef. createInstance2(this

在WebGrid中做 批量删除操作

一般的MVC WebGrid都是在每一行中加入 Edit Detail Delete 这些Link 去对每条记录去单独操作. 稍微研究了一下总结一个 做批量删除的办法. 1. 首先是在WebGrid中加入一列CheckBox代码如下 grid.Column(header: " ", format: @<text><input class="check-box" id="chkbox" name="chkbox"

二叉查找树中节点的删除

二叉查找树重要性质: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值:  (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3)左.右子树也分别为二叉排序树: 现有,如下一棵二叉查找树. (图1) 现在,若要删除图1中,任意节点,需要考虑如下三种情况: (1)需要删除的节点下并没有其他子节点. (2)需要删除的节点下有一个子节点(左或右). (3)需要删除的节点下有两个子节点(既左右节点都存在). 第一种情况直接删除即可,下面,直接讨论第二种情况. 若我们要删除

JS中split用法和数组中元素的删除

JS中split用法 <script language="javascript"> function spli(){ datastr="2,2,3,5,6,6"; var str= new Array(); str=datastr.split(","); for (i=0;i<str.length ;i++ ) { document.write(str[i]+"<br/>"); } } spli(

Sqlserver 实际开发中常见的数据库操作增删改查----删

--我们就以院系,班级,学生来举例. create TABLE [dbo].YuanXi ( Id int IDENTITY(1,1) NOT NULL,--学校id 自增量 YuanXiName varchar(50) null, --院系名字 ) create TABLE [dbo].Class ( Id int IDENTITY(1,1) NOT NULL,--班级id 自增量 YuanXiID int null,--院系id ClassName varchar(50) null --班级

javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)

主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除splice(需明确位置) 9.数组遍历 10.jQuery根据元素值删除数组元素的方法 数组常见操作包含了 增.删.查.改.插入.交集.并集 1.数组整体元素修改 //map,给数组每个元素加1 输出[1,2,3] $.map([0,1,2],function(n){ return n+1; })

JSON相关知识,转载:删除JSON中数组删除操作

一:JSON是什么 JSONg格式:对象是一个无序的“名称/值”对的集合. 对象以括号开始,括号结束. 名称冒号分隔值. "名称/值"之间用逗号分隔 例: var people = {     "programmers": [{         "firstName": "Brett",         "lastName": "McLaughlin",         "em

STL中慎重选择删除元素的方法

 一.要删除容器中有特定值的所有对象 1.如果容器是vector.string或deque,则使用erase-remove习惯用法.例如: vector<int> c; c.erase(remove(c.begin(),c.end(),1963),c.end());//删除值是1963的元素 下面讲一下算法remove: template<classForwardIterator,class T> ForwardIteratorremove(ForwardIterator fi

jquary根据td中按钮的元素属性删除tr行(删选出想删除的行)

删除没有蓝色按钮的行. <html> <tr> <td>凉山彝族自治州分行</td> <td>管理网</td> <td>离行式ATM</td> <td class="text-center">MSTP</td> <td>西昌市西客站航天阳光</td> <td class="text-center">建设中<