Treap C++代码实现

news2024/11/25 22:00:21

 一、全部代码

#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

//Treap结构
struct TreapNode
{
    TreapNode *pLeft, *pRight;
    int value, fix;
};

//左旋
void TreapLeftRotate(TreapNode* &pCur){
    //首先,找到当前根节点的右子树
    TreapNode* rightChild = pCur->pRight;
    //然后把右子树的左孩子接到当前根节点的右子树
    pCur->pRight = rightChild->pLeft;
    //再设右子树的左孩子为当前根节点
    rightChild->pLeft = pCur;
    pCur = rightChild;
}
//右旋
void TreapRightRotate(TreapNode* & pCur){
    //首先,找到当前根节点左子树
    TreapNode* leftChild = pCur->pLeft;
    //然后,把左子树的右孩子接到当前根节点的左子树
    pCur->pLeft = leftChild->pRight;
    //再设左子树的右孩子为当前根节点
    leftChild->pRight = pCur;
    pCur = leftChild;
}
//插入
void TreapInsert(TreapNode* &pCur, int newV){
    //要插入首先要找到插入的位置,如果要插入的节点为NULL,说明到达了该插入的时机
    if(pCur == NULL){
        pCur = new TreapNode; //开辟空间
        pCur->value = newV; //赋值
        pCur->pLeft = NULL; //新节点左子树为NULL
        pCur->pRight = NULL; //新节点右子树为NULL
        pCur->fix = rand()%10000; //给予一个修正随机数
    }
    //如果当前节点的值比newV大,就往左找
    else if(newV < pCur->value){
        TreapInsert(pCur->pLeft, newV);//向左递归插入
        //插入之后,要进行fix的修正,因为是向左子树递归,所以判断左子树的fix大小并右旋即可
        if(pCur->pLeft->fix < pCur->fix){
            TreapRightRotate(pCur);
        }
    }
    //同上
    else{
        TreapInsert(pCur->pRight, newV);
        if(pCur->pRight->fix < pCur->fix){
            TreapLeftRotate(pCur);
        }
    }
}

//查找
TreapNode* TreapSearch(TreapNode* pCur, int totalValue){
    //相等说明找到了
    if(pCur == NULL) return NULL;
    if(pCur->value == totalValue){
        return pCur;
    }
    //不相等就判断他在当前节点的左边还是右边
    else if(pCur->value < totalValue)
        return TreapSearch(pCur->pRight, totalValue);
    else
        return TreapSearch(pCur->pLeft, totalValue);
}

//删除
void TreapDelete(TreapNode* &pCur, int deleteValue){
    //如果相等说明有这个值,进行删除
    if(pCur->value == deleteValue){
        //如果是只有一个节点或者没有节点的情况
        if(pCur->pLeft == NULL || pCur->pRight == NULL){
            TreapNode* deleteNode = pCur; //记录要删除的节点
            //判断左右子树哪个不是NULL,直接将它放在删除节点的位置
            if(pCur->pLeft != NULL){
                pCur = pCur->pLeft;
            }
            else{
                pCur = pCur->pRight;
            }
            delete deleteNode; //删除节点
        }
        //如果是有两个结点的情况
        else{
            //左子树fix值比右子树fix值小
            if(pCur->pLeft->fix < pCur->pRight->fix){
                TreapRightRotate(pCur);//右旋
                TreapDelete(pCur->pRight, deleteValue); //由于右旋将要删除的元素移动到了右侧,所以向右继续递归删除
            }
            else{
                TreapLeftRotate(pCur);
                TreapDelete(pCur->pLeft, deleteValue);
            }
        }
    }
    //如果不相等就继续找
    else if(pCur->value < deleteValue)
        TreapDelete(pCur->pRight, deleteValue);
    else
        TreapDelete(pCur->pLeft, deleteValue);
}

//先序遍历
void preOrder(TreapNode* pCur){
    if(pCur != NULL){
        cout << "(" << pCur->value << " ," << pCur->fix << ")";
        preOrder(pCur->pLeft);
        preOrder(pCur->pRight);
    }

}

//中序遍历
void inOrder(TreapNode* pCur){
    if(pCur == NULL){
        inOrder(pCur->pLeft);
        cout << "(" << pCur->value << " ," << pCur->fix << ")";
        inOrder(pCur->pRight);
    }

}
TreapNode *root=NULL;
int main()
{
    srand((unsigned)time(0));
    int data[]={1,2,3,4,5,6,7,8,9,10,2,5,6};
    int n=sizeof(data)/sizeof(int),i,cnt=0;
    for(i=0;i<n;i++)
    {
        //先查找是否存在
        TreapNode* pFound = TreapSearch(root, data[i]);
        //不存在就插入
        if(pFound==NULL)
        {
            TreapInsert(root,data[i]);
            cnt++;//记录元素个数
        }
    }
    //删除之前的树
    cout << "删除之前的树:";
    inOrder(root);//中序遍历
    cout << endl;
    preOrder(root); //先序遍历

    TreapDelete(root,4); //删除一个4测试

    //删除之后的树
    cout<<"\n"<<cnt<<endl;
    cout << "删除之后的树:";

    inOrder(root);
    cout<<endl;
    preOrder(root);
    return 0;
}

二、运行结果 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

平衡树原理讲解

平衡树——Treap 文章目录 平衡树——TreapBST定义性质操作插入insert(o, v)删除del(o, v)找前驱 / 后继get_prev(o)、get_next(o)查找最大 / 最小值get_min(o)、get_max(o)求元素排名get_rank(o)查找排名为 k k k的元素get_value_by_rank 平衡树左旋、右旋zag(o)、zig(o)左旋右…

Vue路由(vue-router)详细讲解指南

Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成&#xff0c;让构建单页面应用变得易如反掌。路由实际上就是可以理解为指向&#xff0c;就是我在页面上点击一个按钮需要跳转到对应的页面&#xff0c;这就是路由跳转&#xff1b; 首先我们来学习三个单词&…

运维小白必学篇之基础篇第八集:LVM实验

LVM实验 实验一&#xff1a; 使用/dev/sdb磁盘完成以下操作&#xff1a; 1、创建5个物理卷&#xff0c;组成大小为10G的卷组vgtest 2、创建大小为3G的逻辑卷lv1&#xff0c;格式化xfs文件系统&#xff0c;实现开机自动挂载 3、为lv1逻辑卷扩容至5G&#xff0c;然后查看扩容之…

男子路遇“纸片鸟”,AI帮忙免惹祸

据报道&#xff0c;近日&#xff0c;河南洛阳一网友在路边偶遇一只“纸片鸟”&#xff0c;小鸟远看像一张纸片&#xff0c;样子十分奇特&#xff0c;而且还死死地盯着自己&#xff0c;像是求救&#xff0c;后来他用手机一查发现是二级保护动物“黄斑苇鳽”&#xff0c;便报警处…

排水管网监测预警系统:为城市排水建设提质增效

最近&#xff0c;城市生命线安全工程占据着行业的头条榜单&#xff0c;与民众生活密不可分的城市基础设施&#xff0c;包括城市的燃气、桥梁、供水、排水、供热、综合管廊等被称为城市生命线。城市生命线安全工程是城市更新和新型城市基础设施建设的重要内容&#xff0c;其主要…

数说故事×中广协丨广告代言人内容商业沙龙走进大湾区

以“娱时俱进&#xff0c;内容赋能”为主题的广告代言人内容商业沙龙&#xff08;大湾区站&#xff09;&#xff0c;近日在广州市白云区美湾广场成功举行。 沙龙由中国广告协会作为指导单位&#xff0c;广东省广告协会与中国广告协会广告代言人工作委员会联合主办&#xff0c;广…

机器视觉陶瓷板外观缺陷检测系统应用

随着科技的不断发展&#xff0c;机器视觉技术在工业领域的应用越来越广泛。其中&#xff0c;机器视觉陶瓷板外观缺陷检测系统是一项十分重要的技术。该系统利用计算机视觉技术对陶瓷板表面的缺陷进行自动化检测&#xff0c;大大提高了生产效率和产品质量。 机器视觉陶瓷板外观…

智能应用搭建平台——LCHub低代码表单 vs 流程表单 vs 仪表盘

1. LCHub低代码如何选择 「流程表单」:填报数据,并带有流程审批功能,适合报销、请假申请或其他工作流; 「表单」:填报数据,并带有数据协作功能,如修改、删除、导入、导出,并可以给不同的人不同的管理权限; 「仪表盘」:数据分析处理、结果展示功能,如数据汇总、趋…

如何实现Web3去中心化云计算的大规模采用?

随着区块链技术的迅猛发展&#xff0c;Web3去中心化云计算正在逐渐崭露头角。它以分布式、安全和透明的特点&#xff0c;为用户和企业提供了许多独特的优势。 然而&#xff0c;要实现Web3去中心化云计算的大规模采用&#xff0c;仍然面临着一些挑战。本文将探讨这些挑战&#x…

[EuroSys2023 Best Poster] 面向动态图的极低时延GNN推理采样服务

作者&#xff1a;沈雯婷 GraphLearn是阿里云机器学习平台PAI 团队和达摩院智能计算实验室图计算团队共建的工业界大规模图神经网络训练框架, 也是一站式图计算平台GraphScope的图学习引擎。GraphLearn最新开源了面向动态图的GNN在线推理实时采样服务(DGS)。DGS具备处理实时高吞…

端口占用解决报错:Web server failed to start. Port 8080 was already in use.

报错信息如下: Description: Web server failed to start.Port 8080 was already in use. Action: Identify and stop the process thats listening on port 8080 or configure this application to listen on another port. 当idea项目启动时报这个错&#xff0c;意思是端…

2019年一月联考逻辑真题

2019年一月联考逻辑真题 三、逻辑推理&#xff1a;第 26&#xff5e;55 小题&#xff0c;每小题 2 分&#xff0c;共 60 分。下列每题给出的 A、B、C、D、 E 五个选项中&#xff0c;只有一项是符合试题要求的。请在答题卡上将所选项的字母涂黑。 真题&#xff08;2019-26&#…

【数据结构】虽然很难很抽象,但是你还是得努力弄懂的数据结构——链表,基本上你每一段代码都可能会用到

链表解决了顺序表插入或删除元素麻烦的问题&#xff0c;链表的存储结构是用一组任意的存储单元来存放线性表的数据元素&#xff0c;这组存储单元可以是连续的&#xff0c;也可以是不连续的。 对每个数据元素ai&#xff0c;除了存储其本身的信息之外&#xff0c;还需存储一个指…

【Vue】详解Vue生命周期

Vue实例的生命周期全过程&#xff08;图&#xff09; &#xff08;这里的红边圆角矩形内的都是对应的Vue实例的钩子函数&#xff09; 在beforeCreate和created钩子函数间的生命周期 在beforeCreate和created之间&#xff0c;进行数据观测(data observer) &#xff0c;也就是在这…

港联证券投资前瞻:新能源汽车再迎助力 科技巨头持续加注机器人领域

上周五&#xff0c;A股主要股指全线走高&#xff0c;沪指涨近1%&#xff0c;上证50指数涨近2%。截至收盘&#xff0c;沪指涨0.79%报3230.07点&#xff0c;深成指涨1.5%报10998.08点&#xff0c;创业板指涨1.22%报2233.27点&#xff0c;上证50指数涨1.73%&#xff1b;两市合计成…

圆梦,终于进阿里了,分享面试题

前面我说过&#xff1a;能去大厂就去大厂&#xff0c;有机会就去争取&#xff0c;年纪轻轻的&#xff0c;多努力就完事了。 总有黑粉怼我&#xff1a;进大厂哪有你说的那么简单&#xff0c;呵呵…… 我笑而不语&#xff0c;你自己都不相信自己&#xff0c;还怎么进&#xff1…

在 Python 中为对象添加属性

我们将介绍如何在 Python 中为对象添加属性。 我们还将通过示例介绍如何在 Python 中更改对象的属性。 在 Python 中为对象添加属性 在 Python 中&#xff0c;我们时常使用对象&#xff0c;因为 Python 是一种面向对象的语言。 对象使我们的代码可重用并易于实现复杂的结构。 …

《MySQL(二):基础篇- SQL》

文章目录 2. SQL2.1 SQL通用语法2.2 SQL分类2.3 DDL2.3.1 数据库操作2.3.2 表操作2.3.2.1 表操作-查询创建2.3.2.2 表操作-数据类型2.3.2.3 表操作-案例2.3.2.4 表操作-修改2.3.2.5 表操作-删除 2.4 图形化界面工具2.4.1 安装2.4.2 使用 2.5 DML2.5.1 添加数据2.5.2 修改数据2.…

MySQL数据同步到ES的4种解决方案

一、背景 大家应该都在各种电商网站检索过商品&#xff0c;检索商品一般都是通过什么实现呢&#xff1f;搜索引擎Elasticsearch。那么问题来了&#xff0c;商品上架&#xff0c;数据一般写入到MySQL的数据库中&#xff0c;那么用于检索的数据又是怎么同步到Elasticsearch的呢&…

[2.0快速体验]Apache Doris 2.0 弹性计算节点快速体验

​1. 概览 我们都知道Doris 目前是一个典型的Share-Nothing的架构&#xff0c;Doris 通过绑定数据和计算资源在同一个节点获得非常好的性能表现. 但随着Doris 计算引擎性能持续提高, 越来越多的用户也开始选择使用Doris直接查询数据湖数据. 这类场景是一种Share-Disk场景, 数据…