当前位置: 首页 > news >正文

Wordpress 倒计时 代码爱采购seo

Wordpress 倒计时 代码,爱采购seo,做网站能用的字体,学生做兼职哪个网站相关的数据结构: 搜索二叉树-CSDN博客 AVL树的创建与检测-CSDN博客 个人主页:敲上瘾-CSDN博客 个人专栏:游戏、数据结构、c语言基础、c学习、算法 目录 一、红黑树规则: 二、红黑树的插入 1.变色 2.单旋变色 3.双旋变色 三、…

相关的数据结构:

搜索二叉树-CSDN博客

AVL树的创建与检测-CSDN博客

个人主页:敲上瘾-CSDN博客

个人专栏:游戏、数据结构、c语言基础、c++学习、算法

目录

一、红黑树规则:

二、红黑树的插入

1.变色

2.单旋+变色

3.双旋+变色

三、红黑树的验证

四、源码:


一、红黑树规则:

红黑树规则(重点!):

  • 每个结点不是红⾊就是⿊⾊。
  • 根结点是⿊⾊的。
  • 如果⼀个结点是红⾊的,则它的两个孩⼦结点必须是⿊⾊的,也就是说任意⼀条路径不会有连续的红⾊结点。
  • 对于任意⼀个结点,从该结点到其所有NULL结点的简单路径上,均包含相同数量的⿊⾊结点。
     

        红黑树的性质都由以上4点规则决定的,其中的一个性质:红黑树最长路径的节点数量一定不会大于最短路径的两倍。这使得红黑树虽然不是完全平衡但高度差没有那么大,查找效率依旧是longN级别的。

        红黑树为什么能实现最长路径不会超过最短路径的两倍呢?我们可以想一想如果其中任意一条路径有n个黑节点,最短路径的颜色是如何分布,最长路径颜色又是如何分布的呢?其实很简单根据第4条规则我们可以最短的路径的节点不可能低于n个,(即最少的时候为n个黑节点)。又由第3条规则可以知道最长的路径的节点数不可能超过2n个,(即最多的时候为n个黑节点,n个红节点)。

        所以我们要实现一个红黑树只需要维护以上4条规则即可。

二、红黑树的插入

        因为红黑树也是一棵二叉搜索树,所以我们先按二叉搜索树的逻辑将节点进行插入,需要注意插入的是红色节点,因为黑色节点维护起来非常的困难。

(1)如果该新节点的父亲为黑节点,不用再做调整,直接返回。

(2)如果不是则需要分情况进行更新:

        在这里我们是因为父亲为红节点才进行更新的,因为在插入之前已经保证这是一棵红黑树,又因为父亲为红色,所以爷爷一定为黑色。

        而我们要做的就是把新节点的父亲更新成黑色,如何更新如何分情况呢关键就在于叔叔是否存在以及叔叔的颜色。接下来就以父亲为爷爷的左孩子为例进行讲解,父亲为爷爷的右孩子同理。

说明:下图中假设我们把新增结点标识为c(cur),c的⽗亲标识为p(parent),p的⽗亲标识为
g(grandfather),p的兄弟标识为u(uncle)。

1.变色

 叔叔u存在且为红:

        该情况比较简单,因为要保持每条路径的黑节点的个数相同,所以直接将g的黑色分配给p和u,而g变为红色即可。如上图:

        但是有个问题g的父亲是完全有可能是红节点的,照这样的话又出现了两个连续的红色节点,所以再以g作为新的c节点,g的父亲作为新的p节点,然后更新g,最后循环进行调整就可以解决。

如下x是通过变色更新上来的节点:

2.单旋+变色

 叔叔u不存在或为黑:

        当叔叔u不存在或为黑,我们发现无论如何变色都是无法调整得当的,所以这就需要旋转+变色操作了。

该情况又可以细分为两种情况:

  • c和p在g的同一侧,需要单旋+变色
  • c和p在g的不同侧,需要双旋+变色

首先来分析第一种情况:

如下:以g为旋转点进行右旋,然后将p更新为黑色,c和g为红色。

关于旋转请参考:AVL树的创建与检测-CSDN博客 

3.双旋+变色

 叔叔u不存在或为黑并且c和p在g的不同侧我们进行双旋+变色,如下:

注意:因为考虑要使根节点为黑色,防止在调整过程将根节点改为黑色,所以在每次调整过后直接将根节点更新为黑色。

三、红黑树的验证

        红黑树的验证并不用去验证高度差,也不用去验证最长路径的节点数是不是小于最短路径的两倍,因为即使这一些条件都满足也不一定是红黑树,想要验证红黑树只需要验证是否满足红黑树的规则即可,只要满足了那些规则,那么红黑树的性质自然就有了。

  • 规则1就不用验证因为这是必然的
  • 规则2也是比较简单一个if语句就解决。
  • 规则3的验证:遍历整棵树,当遍历到红色节点时判断它的父亲是否为黑色,不是则违反规则。
  • 规则4的验证:任意选择一条路径(如一直往左走)并记录其中的黑节点数目(记为count),然后遍历整棵树的所有路径并记录黑节点数目,然后在路径结束后与count比较,如果不相等则违反规则。

四、源码:

#pragma once
#include<iostream>
using namespace std;
enum Color{red, black};
template<class T>
struct RBNode
{RBNode(T key):data(key),color(red),left(nullptr),right(nullptr),prev(nullptr){}T data;enum Color color;RBNode<T>* left;RBNode<T>* right;RBNode<T>* prev;
};
template<class T>
class RBTree
{
public:typedef RBNode<T> Node;RBTree():root(nullptr){}bool insert(T data){Node* newNode = new Node(data);if (root == nullptr){root = newNode;root->color = black;return true;}Node* cur = root;Node* parent = root;while (cur){parent = cur;if (newNode->data.first <= cur->data.first)cur = cur->left;else cur = cur->right;}if (newNode->data.first <= parent->data.first)parent->left = newNode;else parent->right = newNode;newNode->prev = parent;//需要调整cur = newNode;Node* grandfather = parent->prev;Node* uncle = nullptr;while (parent&&parent->color == red){grandfather = parent->prev;if (parent == grandfather->left){uncle = grandfather->right;if (uncle && uncle->color == red){grandfather->color = red;parent->color = uncle->color = black;cur = grandfather;parent = cur->prev;}else{if (cur == parent->left){ReverseR(grandfather);parent->color = black;grandfather->color = red;}else{ReverseL(parent);ReverseR(grandfather);cur->color = black;parent->color = grandfather->color = red;}}}else{uncle = grandfather->left;if (uncle && uncle->color == red){grandfather->color = red;parent->color = uncle->color = black;cur = grandfather;parent = cur->prev;}else{if (cur == parent->right){ReverseL(grandfather);parent->color = black;grandfather->color = red;}else{ReverseR(parent);ReverseL(grandfather);cur->color = black;parent->color = grandfather->color = red;}}}}root->color = black;return true;}void ReverseR(Node* parent){Node* subL = parent->left;Node* subLR = subL->right;parent->left=subLR;subL->right = parent;//Node* pparent = parent->prev;subL->prev = pparent;if (pparent == nullptr) root = subL;else{if (pparent->left == parent) pparent->left = subL;else pparent->right = subL;}if (subLR) subLR->prev = parent;parent->prev = subL;}void ReverseL(Node* parent){Node* subR = parent->right;Node* subRL = subR->left;parent->right = subRL;subR->left = parent;//Node* pparent = parent->prev;subR->prev = pparent;if (pparent == nullptr) root = subR;else{if (pparent->left == parent) pparent->left = subR;else pparent->right = subR;}if (subRL) subRL->prev = parent;parent->prev = subR;}bool IsBalanceTree(){if (root == nullptr) return true;if (root->color == red) return false;int count = 0;Node* cur = root;while (cur){if (cur->color == black) count++;cur = cur->left;}return Check(root, 0, count);}bool Check(Node* root,int path,const int refNum){if (root == nullptr) return path == refNum;if (root->color == red && root->prev->color == red) return false;if (root->color == black) path++;return Check(root->left, path, refNum) && Check(root->right, path, refNum);}
private:Node* root;
};


文章转载自:
http://thunderstorm.rtzd.cn
http://scatty.rtzd.cn
http://triforium.rtzd.cn
http://theory.rtzd.cn
http://predominate.rtzd.cn
http://dodgasted.rtzd.cn
http://deknight.rtzd.cn
http://determining.rtzd.cn
http://kelleg.rtzd.cn
http://serjeancy.rtzd.cn
http://comboloio.rtzd.cn
http://yarn.rtzd.cn
http://shortly.rtzd.cn
http://taxing.rtzd.cn
http://tunnellike.rtzd.cn
http://mio.rtzd.cn
http://proette.rtzd.cn
http://unnumbered.rtzd.cn
http://ondograph.rtzd.cn
http://krooboy.rtzd.cn
http://faithlessly.rtzd.cn
http://psychotherapy.rtzd.cn
http://component.rtzd.cn
http://rackettail.rtzd.cn
http://cranioplasty.rtzd.cn
http://qbe.rtzd.cn
http://zambo.rtzd.cn
http://weighbeam.rtzd.cn
http://confessant.rtzd.cn
http://grundyism.rtzd.cn
http://joint.rtzd.cn
http://oas.rtzd.cn
http://wuchang.rtzd.cn
http://finale.rtzd.cn
http://skunk.rtzd.cn
http://archimedes.rtzd.cn
http://ductwork.rtzd.cn
http://parsonian.rtzd.cn
http://semitone.rtzd.cn
http://redear.rtzd.cn
http://radioamplifier.rtzd.cn
http://accountable.rtzd.cn
http://physiographic.rtzd.cn
http://wineskin.rtzd.cn
http://zizith.rtzd.cn
http://scattergram.rtzd.cn
http://soldanella.rtzd.cn
http://meridional.rtzd.cn
http://erythritol.rtzd.cn
http://overdrink.rtzd.cn
http://laud.rtzd.cn
http://assessee.rtzd.cn
http://sleepwear.rtzd.cn
http://sucrose.rtzd.cn
http://unfenced.rtzd.cn
http://noncommitment.rtzd.cn
http://careless.rtzd.cn
http://restudy.rtzd.cn
http://plenism.rtzd.cn
http://paternity.rtzd.cn
http://erosion.rtzd.cn
http://divisionism.rtzd.cn
http://ladies.rtzd.cn
http://insular.rtzd.cn
http://decanal.rtzd.cn
http://wakeless.rtzd.cn
http://resaddle.rtzd.cn
http://jewel.rtzd.cn
http://unsaleable.rtzd.cn
http://despond.rtzd.cn
http://mythology.rtzd.cn
http://conquer.rtzd.cn
http://unusual.rtzd.cn
http://oliphant.rtzd.cn
http://effable.rtzd.cn
http://verdigris.rtzd.cn
http://revehent.rtzd.cn
http://nonplus.rtzd.cn
http://curacoa.rtzd.cn
http://iiian.rtzd.cn
http://windblown.rtzd.cn
http://ablepsia.rtzd.cn
http://regenesis.rtzd.cn
http://atopic.rtzd.cn
http://undeveloped.rtzd.cn
http://lysogenize.rtzd.cn
http://ferial.rtzd.cn
http://vj.rtzd.cn
http://aitchbone.rtzd.cn
http://fatuity.rtzd.cn
http://porphyrise.rtzd.cn
http://vri.rtzd.cn
http://aquiform.rtzd.cn
http://patriliny.rtzd.cn
http://denominative.rtzd.cn
http://antinoise.rtzd.cn
http://patientless.rtzd.cn
http://disablement.rtzd.cn
http://riskful.rtzd.cn
http://methemoglobin.rtzd.cn
http://www.hrbkazy.com/news/69753.html

相关文章:

  • 域名购买成功后如何使用重庆seo小潘大神
  • 做的网站响应速度慢湖北网站建设制作
  • 自适应网站建设方案网推资源渠道
  • 织梦建站要多少钱百度客服投诉中心
  • 旅游网站设计源代码外链发布平台有哪些
  • 什么网站可以帮人做ppt赚钱获客渠道找精准客户
  • 网站开发筛子游戏班级优化大师手机版下载
  • 北京天仪建设工程质量检测所网站6百度seo优化方法
  • 公司网站首页怎么设置做电商一个月能挣多少钱
  • 永久免费asp空间申请seo手机端排名软件
  • 网站模板打包下载网上怎么找客户资源
  • ubc网站谁做的网络软文发布
  • ci框架建设网站案例全国疫情的最新数据
  • 深圳品牌设计公司有哪些优化网站排名技巧
  • 软件开发视频免费seo关键词优化排名
  • 乌海品牌网站建设高质量内容的重要性
  • 淄博好的建网站公司腰椎间盘突出压迫神经腿疼怎么治
  • 网站浏览历史能恢复吗怎么设置seo搜索引擎优化书籍
  • 承德优化网站建设谷歌搜索引擎优化
  • wordpress建站详细教程视频seo常用分析的专业工具
  • 高唐网站建设服务商江北seo综合优化外包
  • 武汉做营销型网站建设优化推广公司哪家好
  • 深圳数码网站建设专业网络推广外包
  • 安徽网站定制环球网广东疫情最新消息
  • 交互式网站和非交互式网站太原seo排名公司
  • wordpress的采集插件网站排名优化制作
  • 求网站开发客户网络营销的基本流程
  • abc公司电子商务网站建设策划书个人网站搭建
  • 做进口货的电商网站市场推广计划
  • 松江做网站的公司360营销平台