苏州建设交易中心网站平台宣传推广策略有哪些

pingmian/2025/10/15 9:12:15/文章来源:
苏州建设交易中心网站,平台宣传推广策略有哪些,电子商务网站建设策划案,云端商城买流量目录 介绍 概念 性质 模拟实现 结点定义 插入 保证平衡的原因 一般情况 特殊情况(uncle为黑) uncle不存在 旋转方式 右旋 迭代器 -- 代码 介绍 概念 红黑树是一种自平衡的二叉搜索树 它是在每个节点上引入额外的颜色信息,通过对任何一条从根到叶子的路径…目录 介绍 概念 性质 模拟实现 结点定义  插入  保证平衡的原因 一般情况 特殊情况(uncle为黑)  uncle不存在 旋转方式 右旋 迭代器 --  代码 介绍 概念 红黑树是一种自平衡的二叉搜索树 它是在每个节点上引入额外的颜色信息,通过对任何一条从根到叶子的路径上各个结点着色方式的限制确保没有一条路径会比其他路径长出俩倍,从而达到高度差的平衡保证了在最坏情况下的时间复杂度为O(log n)同时,它也是c标准库中两种关联容器(set和map)的底层实现 性质 结点颜色只有红色,黑色两种根结点必须是黑色每个叶子结点也就是平常被我们忽略的空结点(NIL结点)都是黑色的不能有两个连续的红色节点(从上到下的路径来看)从任意一个节点到其每个叶子节点的路径必须包含相同数目的黑色节点这被称为黑色高度Black Height 满足以上性质后,可以保证红黑树中,其最长路径中节点个数不会超过最短路径节点个数的两倍 模拟实现 结点定义  和avl树一样,需要频繁用到父结点,所以需要一个parent成员除此之外,他还需要存储每个结点的颜色信息库中定义: stl库中,红黑树实际上还有一个哨兵位的头结点(当然没有也可以)可以看到,树中定义了一个成员变量header且可以从命名来看,header的left指向树的最小结点,right指向树的最大结点,parent指向树的根结点 其次,结点插入一般设置为红色 因为有不能有连续红色的性质,所以直接插入红色结点,有助于确保平衡 插入  首先,和avl树一样,需要先找到插入结点的位置(如果重复就不插入了)主要需要修改的是parent,uncle,grandfather的颜色,而cur(或是新插入结点)的位置确保是红色!!!!注意!!!!一定要记住我们的红黑树是有一个头结点的记得一定要在旋转时  改根结点和头结点之间的连接以及判断循环的时候,有些结束条件就是遍历到头结点!!! 保证平衡的原因 黑色结点数目相等:保证了每条路径的高度在可控范围内红色不能连续:保证红色节点的父节点和子节点之间的黑色节点数目是相等的从而保持了黑色平衡性由于黑色结点数相等,虽然没有限制红色结点数,但不能有连续红色结点,这两个就保证红结点最多有黑结点个,最少没有,所以不会超过两倍 一般情况 需要让parent和uncle都变黑,而grandfather变红(注意:因为parent是红色,所以grandfather是一定存在的,注意性质嗷) 如果grandfather不是根结点,就需要继续向上调整,让cur指向grandfather的位置 如果是根结点,就结束 !!!!注意,循坏外一定要让根结点的颜色为黑,因为可能会调整根为红色 特殊情况(uncle为黑)  一轮变色后,此时uncle为黑: 如果让parent,uncle变黑,grandfather变红,会让parent那条路径多一个黑色结点,而uncle那条路数目没有变,所以单纯的变色满足不了这种情况了 同理,uncle不存在也是一样  uncle不存在 会发现,此时无法变色,否则会在parent分支中,多出一个黑色结点 而且,这个结构,是不是让我们想起了avl树中的右旋 所以,在这两种情况下,需要旋转变色,才能保证红黑树的平衡 旋转方式 像上面这种情况,很明显是要对grandfather右旋,最后parent成为这支树的根结点 由此,旋转方式其实就是由cur,parent,grandfather的相对位置,来确定 右旋 像这个例子,就是非常典型的右旋 旋转后,让新的根结点为黑色,剩下两个为红色 这个变色方式确实很神奇 再来分析一下,上面的uncle为黑时的旋转方式 因为此时,这三个结点的相对位置依然是右旋   右旋后: 然后进行变色,依然是根为黑色,其他两个为红色: 很神奇吧,这样就能让红黑树平衡了  其它旋转方式都是一样的,旋转完后让根为黑色,其他两个为红色即可  迭代器 底层实际上就是结点指针,在此之上进行了封装 还记得我们如果要遍历平衡树得用中序遍历吗,指针的挪动也是借助中序的思想 中序:左根右 那么如果当前结点有右树,就找到右树中的最小结点如果当前结点没有右子树,那么就判断它和父亲的位置如果父亲的左子树就是当前结点,那么后就是父亲如果是当前结点在右树,说明parent这一支子树已经遍历完毕,该从parent的位置继续判断直到parent遍历到了phead的位置(那个头结点) --  和上面的类似,只不过是倒着走 也就是右根左的方向 那么如果当前结点有左树,就找到左树中的最大结点如果当前结点没有左子树,那么就判断它和父亲的位置如果父亲的右子树就是当前结点,那么--后就是父亲如果是当前结点在左树,说明parent这一支子树已经遍历完毕,该从parent的位置继续判断直到parent遍历到了phead的位置(那个头结点) 代码 #pragma once#include iostream #include vector #include string #include queue #include cassert #include cstdlib #include utility// 有迭代器的红黑树 namespace my_RB_Tree {enum colour{black,red};template class Tstruct RBTreeNode // 结点{RBTreeNode(const T data): _left(nullptr),_right(nullptr),_parent(nullptr),_col(red),_data(data){}RBTreeNode *_left;RBTreeNode *_right;RBTreeNode *_parent;colour _col;T _data;};template class T, class Ptr, class Ref // T是元素类型,ptr是指针类型,ref是引用类型(后两种会有const类型)struct RBTreeIterator // 迭代器{typedef RBTreeNodeT Node;typedef RBTreeIteratorT, Ptr, Ref Self;RBTreeIterator(Node *pNode): _pNode(pNode){}// 让迭代器具有类似指针的行为Ref operator*(){return _pNode-_data;}Ptr *operator-(){return (_pNode-_data);}// 让迭代器可以移动前置/后置Self operator(){Increament();return *this;}Self operator(int){Self tmp(*this);Increament();return tmp;}// 让迭代器可以移动前置/后置--Self operator--(){DeIncreament();return *this;}Self operator--(int){Self tmp(*this);DeIncreament();return tmp;}// 让迭代器可以比较bool operator!(const Self s) const{return _pNode ! s._pNode;}bool operator(const Self s) const{return _pNode s._pNode;}private:void Increament();void DeIncreament();Node *_pNode;};// 为了后序封装map和set本代码的红黑树会有一个作为哨兵位的头结点template class K, class T, class KeyOfT // K是关键字的类型,T是元素类型(区分这两个的原因:会用该红黑树封装成set和map,而map是key_value的)// keyofT是返回关键字类型的值(否则map无法返回)class RBTree // 红黑树{public:typedef RBTreeNodeT Node;typedef RBTreeIteratorT, T *, T iterator;typedef RBTreeIteratorT, const T *, const T const_iterator;public:RBTree(){_pHead new Node(T());_pHead-_left _pHead;_pHead-_parent nullptr;_pHead-_right _pHead;}// 在红黑树中插入值为data的节点插入成功返回true否则返回falsestd::pairiterator, bool Insert(const T data);// 检测红黑树中是否存在值为data的节点存在返回该节点的地址否则返回nullptrNode *Find(const K data);// 获取红黑树最左侧节点Node *LeftMost();// 获取红黑树最右侧节点Node *RightMost();iterator begin(){return iterator(LeftMost());}iterator end(){return iterator(_pHead);}const_iterator begin() const{return const_iterator(LeftMost());}const_iterator end() const{return const_iterator(_pHead);}// 检测红黑树是否为有效的红黑树注意其内部主要依靠_IsValidRBTRee函数检测bool IsValidRBTRee(){Node *root _pHead-_parent;if (root-_col red){return false;}int count 0;find_blacknode(count, _pHead-_parent);return _IsValidRBTRee(_pHead-_parent, count, 0);}private:bool _IsValidRBTRee(Node *pRoot, size_t blackCount, size_t pathBlack);// 左单旋void RotateL(Node *pParent);// 右单旋void RotateR(Node *pParent);// 为了操作树简单起见获取根节点Node *GetRoot(){return _pHead-_parent;}void find_blacknode(int count, Node *root){if (root nullptr){return;}if (root-_col black){count;}find_blacknode(count, root-_left);find_blacknode(count, root-_right);}private:Node *_pHead nullptr;};template class K, class T, class KeyOfTvoid RBTreeK, T, KeyOfT::RotateL(Node *pParent){Node *cur pParent-_right, *curleft cur-_left;// 连接p和cur左树,因为该位置被p占据pParent-_right curleft;if (curleft){curleft-_parent pParent;}// 连接父结点if (pParent-_parent ! _pHead){Node *ppnode pParent-_parent;if (ppnode-_left pParent){ppnode-_left cur;}else{ppnode-_right cur;}cur-_parent ppnode;}else{_pHead-_parent cur;cur-_parent _pHead;}// 连接p和curpParent-_parent cur;cur-_left pParent;}template class K, class T, class KeyOfTvoid RBTreeK, T, KeyOfT::RotateR(Node *pParent){Node *cur pParent-_left, *curright cur-_right;// 连接p和cur右树,因为该位置被p占据pParent-_left curright;if (curright){curright-_parent pParent;}// 连接父结点if (pParent-_parent ! _pHead){Node *ppnode pParent-_parent;if (ppnode-_left pParent){ppnode-_left cur;}else{ppnode-_right cur;}cur-_parent ppnode;}else{_pHead-_parent cur;cur-_parent _pHead;}// 连接p和curpParent-_parent cur;cur-_right pParent;}template class K, class T, class KeyOfTtypename RBTreeK, T, KeyOfT::Node *RBTreeK, T, KeyOfT::LeftMost(){Node *cur _pHead-_parent;while (cur-_left){cur cur-_left;}return cur;}template class K, class T, class KeyOfTtypename RBTreeK, T, KeyOfT::Node *RBTreeK, T, KeyOfT::RightMost(){Node *cur _pHead-_parent;while (cur-_right){cur cur-_right;}return cur;}template class K, class T, class KeyOfTtypename RBTreeK, T, KeyOfT::Node *RBTreeK, T, KeyOfT::Find(const K data) // 注意这里,{Node *cur _pHead-_parent;KeyOfT kot;while (cur){if (data kot(cur-_data)){cur cur-_right;}else if (data kot(cur-_data)){cur cur-_left;}else{return cur;}}return nullptr;}template class K, class T, class KeyOfTstd::pairtypename RBTreeK, T, KeyOfT::iterator, bool RBTreeK, T, KeyOfT::Insert(const T data) // 为了和map适配,要返回pair类型//(first是插入元素所在的迭代器,second是bool值,判断是否成功插入){KeyOfT kot;Node *newnode nullptr;if (_pHead-_parent nullptr){newnode new Node(data);newnode-_col black;_pHead-_parent newnode;newnode-_parent _pHead;return std::make_pair(iterator(newnode), true);}else{Node *cur _pHead-_parent, *parent cur;while (cur){if (kot(data) kot(cur-_data)){parent cur;cur cur-_right;}else if (kot(data) kot(cur-_data)){parent cur;cur cur-_left;}else{return std::make_pair((iterator)cur, false);}}newnode new Node(data);cur newnode;cur-_parent parent;if (kot(parent-_data) kot(cur-_data)){parent-_left cur;}else{parent-_right cur;}Node *grandfather nullptr;while (parent parent-_col red){grandfather parent-_parent; // 因为父结点是红色,所以肯定有爷爷结点(注意红黑树规则:根结点必须是黑色)if (grandfather-_left parent) // 确定父亲位置{Node *uncle grandfather-_right; // 也就能确定叔叔位置if (uncle uncle-_col red){parent-_col uncle-_col black;grandfather-_col red;}else // 如果uncle不存在/为黑,就需要旋转变色了{// 需要先判断旋转类型(也就是判断 -- parent和cur的相对位置)if (parent-_left cur){// 一条偏右的直线,需要右旋RotateR(grandfather);// 旋转完后parent成为根结点// 更改完结点指向后,就可以改颜色了(都是根结点为黑,另外两个为红)parent-_col black;cur-_col grandfather-_col red; // 和cur一层}else{// 拐角在左边,也就是先左旋,再右旋RotateL(parent);RotateR(grandfather);// cur成为根结点// 改颜色cur-_col black;parent-_col grandfather-_col red;}break;}}else // parent在grandfather的右树{Node *uncle grandfather-_left;if (uncle uncle-_col red){parent-_col uncle-_col black;grandfather-_col red;}else // 如果uncle不存在/为黑,就需要旋转变色了{// 需要先判断旋转类型(也就是判断 -- parent和cur的相对位置)if (parent-_right cur){// 一条偏左的直线,需要左旋RotateL(grandfather);parent-_col black;cur-_col grandfather-_col red; // 和cur一层}else{// 拐角在right,也就是先右旋,再左旋RotateR(parent);RotateL(grandfather);// 改颜色cur-_col black;parent-_col grandfather-_col red;}break;}}cur grandfather; // 注意,这里会改cur的指向,但返回值需要返回插入位置的迭代器,所以需要另外保存parent cur-_parent;}(_pHead-_parent)-_col black; // 根结点必须为黑(防止它在上面的循环中被修改)}return std::make_pair(iterator(newnode), true);}template class K, class T, class KeyOfTbool RBTreeK, T, KeyOfT::_IsValidRBTRee(Node *cur, size_t blackCount, size_t pathBlack){if (cur nullptr){// 到空结点后,就说明一条路径已经走通了,可以用得到的黑色结点数与基准数对比,不一样就说明红黑树错误if (pathBlack ! blackCount){return false;}else{return true;}}if (cur-_parent){Node *ppnode cur-_parent;if (cur-_col red ppnode-_col red){return false;}}if (cur-_col black){pathBlack;}return _IsValidRBTRee(cur-_left, blackCount, pathBlack) _IsValidRBTRee(cur-_right, blackCount, pathBlack);}template class T, class Ptr, class Refvoid RBTreeIteratorT, Ptr, Ref::Increament(){Node *cur _pNode, *parent _pNode-_parent;if (cur-_right){// 找到右子树的最小结点Node *curright cur-_right;while (curright-_left){curright curright-_left;}_pNode curright;}else{while (parent-_parent ! cur parent-_right cur) // 找到cur是parent的左结点的位置,这样parent的位置就是下一个位置{cur parent;parent parent-_parent;}_pNode parent;}}template class T, class Ptr, class Refvoid RBTreeIteratorT, Ptr, Ref::DeIncreament(){Node *cur _pNode, *parent _pNode-_parent;if (cur-_left){// 找到左子树的最大结点Node *curleft cur-_left;while (curleft-_right){curleft curleft-_right;}_pNode curleft;}else{while (parent-_parent ! cur parent-_left cur) // 找到cur是parent的左结点的位置,这样parent的位置就是下一个位置{cur parent;parent parent-_parent; }_pNode parent;}} }

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

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

相关文章

电子商务网站建设实验青海建设工程云网站

柱状图 - category-work,grid直角坐标,legend,series-bar柱状图,tooltip提示框 - makeapie echarts社区图表可视化案例

宁波企业网站排名优化wordpress 标签插件

地址:https://pan.baidu.com/s/18LMEo-_WYcoyTOkWYJ0NUg 提取码:1234 仿真图: 1)设计一个能进行拔河游戏的电路,通过按键控制游戏开始和复位。 2)电路使用9个发光二极管排成一行,中间的LED为拔…

cms仿站教程高端网站设计收费

一、命名空间 TypeScript 中的命名空间(Namespace)用于将代码组织到逻辑分组中。在 TypeScript 中,命名空间是一个独立作用域中的代码集合。 1、示例 下面是一个简单的 TypeScript 命名空间示例: namespace MyNamespace {export…

上海做网站站优云一一十六湘潭手机网站

视图 前言正式开始视图用户管理user表创建新用户修改用户密码权限管理给用户赋权剥夺权限 前言 本篇所讲的视图和我上一篇事务中所讲的读视图不是一个东西,二者没有任何关系,如果看过我前一篇博客的同学不要搞混了。 其实视图和用户管理本来是想着分开…

网站不能调用样式如何加强高校网站建设

wav文件格式分析详解 程序如上一篇博文 一、综述 WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是“RIFF”。 WAVE文件是由若干个Chunk组成…

c 做的网站潍坊建设工程信息网站

一、安装jieba库:\>pip install jieba #或者 pip3 install jieba二、jieba库解析jieba库主要提供提供分词功能,可以辅助自定义分词词典。jieba库中包含的主要函数如下:jieba.cut(s) …

网站空间源码浙江制做网站的公司

定义:正则表达式说白了就是有普通字符、以及特殊字符组成的文子模式。{匹配模式标准}正则表达式将会作为一个模板与所搜索的字符串进行匹配。可以让使用者轻易达到搜寻/删除/取代某些特定字符的处理程序。此外vim、grep、find、awk、sed等命令都支持正则表达式注&am…

泉州做网站多少钱书画工作室网站模板网站建设

五、畸变矫正—让世界不在扭曲 这篇博文所要讲述的内容,是标定的主要用途之一:矫正摄像机的畸变。对于图像畸变矫正的方法,张正友教授也在其大作“A Flexible New Technique forCamera Calibration”中给出。 玉米在这里先为大家介绍一下&…

长春网站制作教程建设网站的安全性

1 JDBC概念 问题&#xff1a;JDBC的本质是什么&#xff0c;解决了什么问题&#xff1f; 2.API讲解 <1> DriverManager的作用 问题&#xff1a;DriverManager有什么作用&#xff1f; 作用一&#xff1a;注册驱动 DriverManager.registerDriver(new Driver())&#…

确定建设电子商务网站目的wordpress转小程序

最近不少宁夏小伙伴在问&#xff0c;宁夏企业过等保选哪家测评机构好&#xff1f;选哪家堡垒机好&#xff1f;今天我们小编就给大家来简单说说哈&#xff01; 宁夏企业过等保选哪家测评机构好&#xff1f; 目前宁夏正规具有资质的等保测评机构只有3家&#xff0c;分别为中电信…

wordpress建站ftp企业内部网站建设

DiscuzX是北京康盛新创科技有限责任公司推出的一套通用的社区论坛软件系统。自2001年6月面世以来&#xff0c;Discuz!已拥有15年以上的应用历史和200多万网站用户案例&#xff0c;是全球成熟度最高、覆盖率最大的论坛软件系统之一。目前最新版本Discuz! X3.4正式版于2017年8月2…

展厅设计素材网站吉林省吉林市有几个区

常用的插件主要有以下&#xff1a; chinese 中文简体安装包 Vetur 语法高亮、智能感知 Vscode-icons 目录树图标 Auto Close 自动添加HTML / XML关闭标签 Beautify 格式化javascript&#xff0c;JSON&#xff0c;CSS&#xff0c;Sass&#xff0c;和HTM css Peek 可以查看CSS ID…

海北公司网站建设韶关网站设计公司

**单片机设计介绍&#xff0c;基于8086汽车智能小车控制系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于 8086 的汽车智能小车控制系统是一种将微处理器技术应用于汽车控制的系统。下面是其主要的设计介绍&#xff1a; 硬…

山东建设执业资格注册中心网站官网微信公众号服务平台电话

使用介绍 在Vue.js中&#xff0c;$attrs 和v-bind可以用于组件的二次封装&#xff0c;以在封装的组件中传递父组件的属性和事件。这对于创建高度可定制的通用组件非常有用。 下面是一些示例代码&#xff1a; 假设你有一个名为MyButton的自定义按钮组件&#xff0c;它接受一些…

建设一个本地网站电子商务网站系统建设实训心得

一、安装应用程序服务器 提示安装成功 二、添加角色服务asp 三、asp网站配置 放入源码 设置网站首页为index.asp: 设置应用程序池 四、设置网站目录属性 五、access数据库连接配置 Cd c:\Windows\System32\inetsrv appcmd list apppool /xml | appcmd set apppool /…

网站的icp是什么意思互联网推广品牌

原题链接&#xff1a; 2908. 元素和最小的山形三元组 I - 力扣&#xff08;LeetCode&#xff09; 题目解读&#xff1a; 给定一个整数数组nums&#xff0c;如果下标i,j,k满足 i<j<knums[i]<num[j]并且nums[k]<num[j] 则称为山型三元组&#xff0c;返回所有山型三…

要怎么做网站动图广州专业网站建设后台管理便捷

这是一个用vue.js对css操作完成的实例。当然用了flex简单布局。一、先创建一个html文件&#xff0c;记得添加vue库文件。二、创建一盒容器vmdiv&#xff0c;用vue绑定它&#xff0c;测试vue绑定后的插入值text1效果。三、加入文本框和两个按钮。四、通过flex排序&#xff0c;让…

徐汇网站开发培训哪里找免费网站

Sentry不支持Hive CLI列权限管理&#xff0c;建议禁用Hive CLI。 &#xff08;也不支持SparkSql列权限管理&#xff09; #权限分为 SELECT ,INSERT ,ALL #查看所有role show roles;#创建role create role role_name;#删除role drop role role_name; #将某个数据库读权限授予…

做村易通网站站长要收费吗百度客户端下载安装

本文实例为大家分享了Python读取MySQL数据库表数据的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 环境&#xff1a;Python 3.6 ,Window 64bit 目的&#xff1a;从MySQL数据库读取目标表数据&#xff0c;并处理 代码&#xff1a; # -*- coding: utf-8 -*- import p…

网站开发 工作量评估新乡网站建设费用

维护品牌或酒店声誉是一场持久战&#xff0c;这对塑造积极的品牌认知和提升客户满意度至关重要。声誉管理包括两个关键部分&#xff1a;引导客人评价和公众舆论&#xff0c;并以适当的方式进行反馈。就在线声誉管理而言&#xff0c;品牌还需要注意另外一点&#xff0c;公众会在…