伸展树(数据结构篇)

数据结构之伸展树

伸展树

概念

  • 伸展树是一颗对任意一个节点被访问后,就经过一系列的AVL树的旋转操作将该节点放到根上的特殊二叉查找树
  • 伸展树能保证对树操作M次的时间复杂度为O(MlogN),而当一个查找树的一个节点刚好处于查找树最坏的情形,我们每次访问都需要按照最坏情形的时间计算,这将耗费O(M*N)的时间,伸展树就是要将访问的节点进行移动,使它不一直存在一个地方,避免了多次操作最坏情形的出现,而伸展树访问的节点比较深,经过移动,对该节点的原先子树节点访问也会避免往更深处进行操作
  • 伸展树不要求保留高度或平衡信息,因此能够节省空间以及简化代码

查找操作

  • 关于访问节点,然后对其进行一系列旋转操作,将该节点放到上,我们需要对访问该节点的路径上(从下到上)每一个节点都需要和它们的父节点实施单旋转,直到将该节点推到根

  • 但是如果只进行单旋转情况,并直接从下到上的话,则会浪费大部分时间

  • 因此我们需要使用展开操作,而展开操作其实就是根据路径树的结构分情况进行操作

  • 具体步骤

    1. 判断路径的结构,分为“之字形”和“一字形
    2. 如果是“之字形”,就需要对要访问的节点进行双旋转操作,如果访问的节点不是根的孙节点,则进行双旋转操作后,会将路径结构转换为“一字形”,然后再进行“一字形”操作,将其放在根上
    3. 如果是“一字形”,就需要路径从下到上逐一进行单旋转操作,直至要访问的节点成为根才结束

    image

删除操作

  • 我们可以通过访问要被删除的节点然后访问后进行删除,这样的话,被删除节点就会被推到根上,将该节点删除,树就会分为两颗子树TL和TR(左子树和右子树)
  • 要想将TL和TR重新合成为一个树,就需要找到TL的最大值,并进行旋转操作将其作为TL的根节点,而此时T**L将是一个没有右儿子的树**,然后将TR的根节点作为现在TL根节点的右儿子

代码:

struct splay{int data;splay* left;splay* right;
};splay* createNode(int data){auto p=new splay;p->data=data;p->left=NULL;p->right=NULL;return p;
}splay* SingleRotatewithLeft(splay* &k1){splay* k2;k2=k1->left;k1->left=k2->right;k2->right=k1;return k2;
}splay* SingleRotatewithRight(splay* &k1){splay* k2;k2=k1->right;k1->right=k2->left;k2->left=k1;return k2;
}splay* DoubleRotatewithLeft(splay* &k1){k1->left= SingleRotatewithRight(k1->left);return SingleRotatewithLeft(k1);
}splay* DoubleRotatewithRight(splay* &k1){k1->right= SingleRotatewithLeft(k1->right);return SingleRotatewithRight(k1);
}//插入
splay* insert(splay* &root,int data){if(NULL==root){splay* add= createNode(data);root=add;}else if(data<root->data){root->left= insert(root->left,data);}else if(data>root->data){root->right= insert(root->right,data);}return root;
}//查找
//因为查找data很有可能是相等的,所以要分开这种情况,如果root的下一个是要找的我们就往上返,令节点差为2个保证了判断路径结构的正确性
splay* search(splay* &root,int data){if(NULL==root||root->data==data){return root;}else if(data<root->data){root->left= search(root->left,data);if(data<root->left->data){root= SingleRotatewithLeft(root);}else if(data>root->left->data){root= DoubleRotatewithLeft(root);}}else if(data>root->data){root->right= search(root->right,data);if(data>root->right->data){root= SingleRotatewithRight(root);}else if(data<root->right->data){root= DoubleRotatewithRight(root);}}return root;
}//查找最小值
int findmin(splay* root){if(NULL==root){return root->data;}if (root->left!=NULL){return findmin(root->left);}else{return root->data;}
}//查找最大值
int findmax(splay* root){if(NULL==root){return root->data;}if(root->right!=NULL){return findmax(root->right);}else{return root->data;}
}//删除树节点
void del(splay* &root,int data){search(root,data);if(NULL==root){return;}else{splay* t1=root->left;splay* t2=root->right;root->left=NULL;root->right=NULL;delete root;int temp= findmax(t1);t1= search(t1,temp);t1->right=t2;root=t1;}
}void inorderprint(splay* root){if(NULL==root){return;}inorderprint(root->left);cout<<root->data<<" ";inorderprint(root->right);
}//清空树
void destroy(splay* &root){if(NULL==root){return;}destroy(root->left);destroy(root->right);delete root;
}

尾言

完整版笔记也就是数据结构与算法专栏完整版可到我的博客进行查看,或者在github库中自取(包含源代码)

  • 博客1: codebooks.xyz
  • 博客2:moonfordream.github.io
  • github项目地址:Data-Structure-and-Algorithms

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

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

相关文章

物联网系统运维——实验备份与恢复,数据镜像软件DRBD介绍,DRBD的安装和应用,extundelete的安装和应用(重点),环境准备,配置设置

一.数据备份 1.数据备份的重要性 备份是系统中需要考虑的最重要的事项,虽然这在系统的整个规划,开发和测试过程中甚至占不到1%,看似不太重要且默默无闻的工作只有到恢复的时候才能真正体现出其重要性,任何数据的丢失与数据宕机&#xff0c;都是不可以被接收的。 2.数据备份策…

基于Pytorch框架构建LeNet-5模型

Pytorch 一、训练模型1.导入必要的库2.设置超参数3.数据预处理4.读取数据 二、定义卷积神经网络1.定义卷积神经网络2.定义学习率3.实例化模型并且移动到GPU4.选择优化器 三、定义调整学习率的函数1.定义调整学习率的函数 四、训练模型1.设置模型为训练模式2.遍历训练数据加载器…

【Day02】0基础微信小程序入门-学习笔记

文章目录 模板与配置学习目标WXML 模板语法1.数据绑定&#xff08;类似于 Vue2 &#xff09;2. 事件绑定3. 条件渲染4.列表渲染 WXSS模板样式1. rpx尺寸单位2.样式导入3. 全局样式和局部样式 全局配置1. window2. tabBar 页面配置网络数据请求总结 持续更新~ 模板与配置 学习目…

gateway整合sentinel限流

官方文档&#xff1a;https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81 从 1.6.0 版本开始&#xff0c;Sentinel 提供了 Spring Cloud Gateway 的适配模块&#xff0c;可以提供两种资源维度的限流&#xff1a; route 维度&#xff1a;即在 Spr…

【第28章】Vue实战篇之用户重置密码

文章目录 前言一、调用接口二、重置密码三、界面展示总结 前言 这里我们来通过调用后端接口来完成密码重置功能并且修改成功清除缓存重新登录。 一、调用接口 export const userResetPasswordService (data)>{return request.patch(/user/updatePwd, data) }二、重置密码…

【数据结构与算法】详解循环队列:基于数组实现高效存储与访问

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​ 目录 一、引言 &#x1f343;队列的概念 &#x1f343;循环队列的概念 &#x1f343;为什…

DIY灯光特效:霓虹灯动画制作教程

下面我们根据这张霓虹灯案例,教大家如何用智能动物霓虹灯闪烁的效果,大家可以根据思路,实现自己想要的动效效果,一起动手来做吧。 即时设计-可实时协作的专业 UI 设计工具 设置背景 新建画板尺寸为:800PX^600PX,设置背景色#120527。 绘制主题 输入自己喜欢文案,轮廓化,具体…

网络基础-协议

一、ARP 通过IP得到Mac 首先会查看缓存的arp表中是否有相应的IP和Mac对应关系&#xff0c;如果有直接进行包封装。如果没有则进行广播当对应的地址就收到广播包后会根据arp中的源地址进行单播返回相应的IP和Mac对应关系。 arp -a 查看现有的arp缓存 二、RARP反向地址解析 通过…

酒店多商户版微信小程序源码

一站式预订新体验 一、引言&#xff1a;打破传统&#xff0c;开启智能预订新时代 在数字化浪潮的推动下&#xff0c;传统的酒店预订方式已经逐渐无法满足现代人的需求。为此&#xff0c;一款集众多酒店商户于一体的“酒店多商户版小程序”应运而生&#xff0c;以其便捷、智能…

江门电子行业实施MES系统前后对比

在江门电子行业实施MES系统之前和之后的对比可以涉及以下几个方面&#xff1a; 生产效率提升&#xff1a;实施MES系统后&#xff0c;江门电子行业可以实现生产过程的实时监控和优化&#xff0c;减少生产中的浪费和停机时间&#xff0c;提高生产效率。 质量控制改善&#xff1a;…

【机器学习】机器学习重要方法——深度学习:理论、算法与实践

文章目录 引言第一章 深度学习的基本概念1.1 什么是深度学习1.2 深度学习的历史发展1.3 深度学习的关键组成部分 第二章 深度学习的核心算法2.1 反向传播算法2.2 卷积神经网络&#xff08;CNN&#xff09;2.3 循环神经网络&#xff08;RNN&#xff09; 第三章 深度学习的应用实…

解释一下在React中,什么是“渲染Props”模式,以及它与使用Hooks之前的状态管理有何不同?

在React中&#xff0c;"渲染Props"模式是一种组件设计模式&#xff0c;它通过将一个函数作为prop传递给组件&#xff0c;允许父组件定义子组件的渲染逻辑。这种模式使得组件更加灵活和可复用&#xff0c;因为它们可以接受一个渲染函数来决定如何渲染自己。 渲染Prop…

视频监控解决方案:视频平台升级技术方案(下)

目录 1 项目概况 2 项目需求 2.1 视频感知资源扩充 2.2 视频支撑能力升级 2.3 视频应用能力升级 3 技术设计方案 3.1系统总体架构 3.2视频感知资源扩充设计 3.3 视频支撑能力升级设计 3.4 视频应用能力升级设计 3.4.1视频资源目录管理 3.4.2标签管理 3.4.3设备智能…

MySQL----undo log回滚日志原理、流程以及与redo log比较

回滚日志 回滚日志&#xff0c;保存了事务发生之前的数据的一个版本&#xff0c;用于事务执行时的回滚操作&#xff0c;同时也是实现多版本并发控制&#xff08;MVCC&#xff09;下读操作的关键技术。 如何理解Undo Log 事务需要保证原子性&#xff0c;也就是事务中的操作要…

Nvidia Isaac Sim图编程OmniGraph 入门教程 2024(6)

Nvidia Isaac Sim 入门教程 2024 版权信息 Copyright 2023-2024 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. …

学习笔记——动态路由——RIP(距离矢量协议)

一、距离矢量协议 1、距离矢量协议 矢量行为&#xff1a;协议收到一个路由之后&#xff0c;查看是否可以加入到本地的路由表中&#xff0c;如果可以加入&#xff0c;则可以传递&#xff0c;如果不可以加入&#xff0c;则无法传递。 距离矢量路由协议 RIP基于距离矢量算法(又…

使用 Reqable 在 MuMu 模拟器进行App抓包(https)

1、为什么要抓包&#xff1f; 用开发手机应用时&#xff0c;查看接口数据不能像在浏览器中可以直接通过network查看&#xff0c;只能借助抓包工具来抓包&#xff0c;还有一些线上应用我们也只能通过抓包来排查具体的问题。 2、抓包工具 实现抓包&#xff0c;需要一个抓包工具…

​【VMware】VMware Workstation的安装

目录 &#x1f31e;1. VMware Workstation是什么 &#x1f31e;2. VMware Workstation的安装详情 &#x1f33c;2.1 VMware Workstation的安装 &#x1f33c;2.2 VMware Workstation的无限使用 &#x1f31e;1. VMware Workstation是什么 VMware Workstation是一款由VMwar…

【多模态】BEIT: BERT Pre-Training of Image Transformers

论文&#xff1a;BEIT: BERT Pre-Training of Image Transformers 链接&#xff1a;https://arxiv.org/pdf/2301.00184 Introduction BEIT&#xff08;Bidirectional Encoder representation from Image Transformers&#xff09;Motivation: 启发于BERT的自编码方式&#xf…

【Linux】Centos升级到国产操作系统Openeuler

一、前言 迁移工具采用Openeuler官网提供的x2openEuler工具&#xff0c;是一款将源操作系统迁移到目标操作系统的迁移工具套件&#xff0c;具有批量化原地升级能力&#xff0c;当前支持将源 OS 升级至 openEuler 20.03。 官网链接&#xff1a;openEuler迁移专区 | 迁移专区首页…