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

民宿预订网站制作百度首页排名优化哪家专业

民宿预订网站制作,百度首页排名优化哪家专业,北京代做网站,各大推广平台文章目录 1.红黑树的概述2.红黑树的性质3.红黑树的代码实现3.1.红黑树的节点定义3.2.红黑树的插入操作3.3.红黑树是否平衡 黑红树是一颗特殊的搜索二叉树,本文在前文的基础上,图解红黑树插入:前文 链接,完整对部分关键代码展示&a…

文章目录

        • 1.红黑树的概述
        • 2.红黑树的性质
        • 3.红黑树的代码实现
          • 3.1.红黑树的节点定义
          • 3.2.红黑树的插入操作
          • 3.3.红黑树是否平衡

黑红树是一颗特殊的搜索二叉树,本文在前文的基础上,图解红黑树插入:前文 链接,完整对部分关键代码展示,完整的代码在gitee仓库中: 链接
文章中有错误的地方,欢迎大家指正!如果有帮助到你,也请多多点赞支持!

1.红黑树的概述

平衡二叉树要求左右子树的高度差的绝对值不超过1,所以平衡二叉树是高度平衡的,正是因为它要求严格控制高度差,在频繁的插入的删除的时候导致旋转次数过多带来了一定的性能消耗!

红黑树也是一颗特殊的搜索二叉树,任何一条从根到叶子的路径上各个结点由颜色(红黑)方式的限制,红黑树确保没有一条路径会比其他路径长出两倍(最长路径不会超过最短路径的两倍),它而是接近平衡的。红黑树没有严格要求高度的平衡,所以红黑树在总体的性能上会略优于平衡二叉树(AVL树)。

在现实的各种应用中都是使用红黑树的来充当数据结构,如:Java集合中的TreeMap,C++STL中Set、Map等都是使用红黑树而不是AVL树。可能在查找方面AVL树会由于红黑树,但是几十次的常数差别,在现代CPU(大概每秒几十亿次)来说完全不受影响,AVL树和红黑树查找的时间复杂度都是在一个等级上O(log_2(N)),红黑树在插入和删除会优于AVL树!

2.红黑树的性质
  1. 每个结点不是红色就是黑色
  2. 根节点必须是黑色的
  3. 如果一个节点是红色的,则它的两个孩子结点必须是是黑色的,(即:不会有两个连续的红节点)
  4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点(即:每条路径上黑色的节点相同)
  5. 每个叶子结点都是黑色的(此处的叶子结点指的是空结点,即下图的NIL)

在这里插入图片描述

关于路径问题

上图有11条路径

为什么满足上面的性质,红黑树就能保证:其最长路径中节点个数不会超过最短路径节点个数的两倍

在这里插入图片描述

最短路径:全黑的路径 最长路径:一黑一红相间的路径

上面的图情况就是最大的(4个节点/2个节点 = 2倍)的情况!

3.红黑树的代码实现
3.1.红黑树的节点定义
enum color
{RED,BLACK
};template<class K, class V>
struct RBNode
{std::pair<K, V> _kv;RBNode<K, V>* _left;RBNode<K, V>* _right;RBNode<K, V>* _parent;color _color;RBNode(const std::pair<K, V> kv):_kv(kv), _left(nullptr), _right(nullptr), _parent(nullptr), _color(RED){}
};
3.2.红黑树的插入操作

第一大类情况:cur、parent为红,grandfather为黑,uncle存在且为红!

在这里插入图片描述

  1. 将parent和uncle都变为黑,grandfather变为红
  2. 但是grandfather,如果是根节点直接将其设为黑即可,
  3. 如果grandfather不为红,如下图:则将cur = grandfather继续重复步骤1和步骤2

在这里插入图片描述

**第二大类情况:**cur为红,parent为红,grandfather为黑,uncle不存在或uncle存在且为黑

单旋的情况:

  1. 下图是uncle不存在或uncle存在且为黑单旋的情况,通过节点的位置判断单旋:如条件是grandfather ->left = parent; parent->left = cur; 直线说明是单旋,都是左边说明右边高,要右单旋!
  2. 变色,grandfather变为红,parent变为黑色;可以看到,调整后的根据原来的grandfather是黑色,无论往上的祖先是何种颜色,都不会出现两个红色连一起的情况,不用往上调整了!

在这里插入图片描述

双旋的情况:

  1. 通过上面的例子可以知道,存在uncle且为黑和不存在uncle的处理结果是一样的!
  2. 通过下图的判断,是折线:grandfather ->left = parnt;parent->right =cur;通过平衡二叉树的插入操作的学习,可以知道,这种情况先左单旋,再右单旋!
  3. 变色:grandfather变为红,cur变为黑;可以看到,调整后的根据原来的grandfather是黑色,无论往上的祖先是何种颜色,都不会出现两个红色连一起的情况,不用往上调整了!

在这里插入图片描述

上面就是红黑树的**左子树的插入操作!右子树的插入99%是一样的!**可能没有99%,哈哈哈!但是是类似的操作!简单画个图:

第一大类情况

在这里插入图片描述

第二大类情况

单旋情况:

在这里插入图片描述

双旋情况:

在这里插入图片描述

bool insert(const std::pair<K, V>& kv)
{if (_root == nullptr){_root = new Node(kv);_root->_color = BLACK;return true;}Node* parent = nullptr;Node* cur = _root;while (cur){if (cur->_kv.first < kv.first){parent = cur;cur = cur->_right;}else if (cur->_kv.first > kv.first){parent = cur;cur = cur->_left;}else{return false;}}cur = new Node(kv);if (parent->_kv.first < kv.first){parent->_right = cur;}else{parent->_left = cur;}cur->_parent = parent;while (parent && parent->_color == RED){Node* grandfather = parent->_parent;// parent是左子树if (parent == grandfather->_left){Node* uncle = grandfather->_right;// 第一大类:uncle存在且为红if (uncle && uncle->_color == RED){// 改变颜色parent->_color = uncle->_color = BLACK;grandfather->_color = RED;// 修改条件,继续往上执行cur = grandfather;parent = cur->_parent;}else // 第二大类:uncle不存在或uncle存在且为黑{// 单旋情况if (cur == parent->_left){// 右单旋RotateRight(grandfather);// 改变颜色parent->_color = BLACK;grandfather->_color = RED;}else  // 双旋情况{RotateLeft(parent);RotateRight(grandfather);cur->_color = BLACK;grandfather->_color = RED;}// 这种情况就不用重复调整,直接跳出循环break;}}else // parent是右子树{Node* uncle = grandfather->_left;if (uncle && uncle->_color == RED){parent->_color = uncle->_color= BLACK;grandfather->_color = RED;cur = grandfather;parent = cur->_parent;}else{if (cur == parent->_right){RotateLeft(grandfather);parent->_color = BLACK;grandfather->_color = RED;}else{RotateRight(parent);RotateLeft(grandfather);cur->_color = BLACK;grandfather->_color = RED;}break;}}}// 根绝对为黑色_root->_color = BLACK;return true;
}
3.3.红黑树是否平衡

根据每条路径的黑节点的个数相同判断!

bool isBanlan()
{// 如何判断是否为红黑树// 1.高度行不行? 不行! 2.能不能根据节点的个数不操作2倍的关系? 也不行// 3.那有什么是确定的?所有路径黑节点的个数相等!根据这个性质!Node* cur = _root;int checkNum = 0;while (cur){if(cur->_color == BLACK)checkNum++;cur = cur->_left;}return isBanlan(_root,checkNum,0); 
}bool isBanlan(Node* root,int &checkNum,int blackNum)
{if (root == nullptr)return true;if (root->_color == BLACK){blackNum++;}if (root->_left == nullptr && root->_right == nullptr){return blackNum == checkNum ? true : false;}bool left = isBanlan(root->_left, checkNum, blackNum);bool right = isBanlan(root->_right, checkNum, blackNum);return left && right;
}

文章转载自:
http://guideline.bbmx.cn
http://paisleyite.bbmx.cn
http://septimus.bbmx.cn
http://tercel.bbmx.cn
http://sorehead.bbmx.cn
http://crossette.bbmx.cn
http://lykewake.bbmx.cn
http://dipleurogenesis.bbmx.cn
http://pupillary.bbmx.cn
http://isoantigen.bbmx.cn
http://okeh.bbmx.cn
http://lona.bbmx.cn
http://hoarsely.bbmx.cn
http://chromium.bbmx.cn
http://stint.bbmx.cn
http://excursus.bbmx.cn
http://wobble.bbmx.cn
http://tabulator.bbmx.cn
http://weathering.bbmx.cn
http://lamina.bbmx.cn
http://forbid.bbmx.cn
http://tamber.bbmx.cn
http://exploitee.bbmx.cn
http://unexamined.bbmx.cn
http://anode.bbmx.cn
http://sensitisation.bbmx.cn
http://podagra.bbmx.cn
http://resonance.bbmx.cn
http://inshallah.bbmx.cn
http://rafvr.bbmx.cn
http://bivouac.bbmx.cn
http://grayness.bbmx.cn
http://galways.bbmx.cn
http://cobby.bbmx.cn
http://mattress.bbmx.cn
http://upflow.bbmx.cn
http://castled.bbmx.cn
http://atraumatic.bbmx.cn
http://remotivate.bbmx.cn
http://thaumaturge.bbmx.cn
http://velarization.bbmx.cn
http://yugoslavia.bbmx.cn
http://friction.bbmx.cn
http://hylotheism.bbmx.cn
http://sidewipe.bbmx.cn
http://rexine.bbmx.cn
http://cogency.bbmx.cn
http://taphole.bbmx.cn
http://condisciple.bbmx.cn
http://eterne.bbmx.cn
http://mesembryanthemum.bbmx.cn
http://superheat.bbmx.cn
http://divinity.bbmx.cn
http://circinal.bbmx.cn
http://seductively.bbmx.cn
http://allodiality.bbmx.cn
http://mesolithic.bbmx.cn
http://unthinkable.bbmx.cn
http://subtilty.bbmx.cn
http://footbinding.bbmx.cn
http://poignancy.bbmx.cn
http://clippie.bbmx.cn
http://enterocele.bbmx.cn
http://particular.bbmx.cn
http://oosperm.bbmx.cn
http://talma.bbmx.cn
http://moabite.bbmx.cn
http://cauline.bbmx.cn
http://timeslice.bbmx.cn
http://gull.bbmx.cn
http://streptomyces.bbmx.cn
http://fowling.bbmx.cn
http://balmoral.bbmx.cn
http://workout.bbmx.cn
http://paulinize.bbmx.cn
http://palet.bbmx.cn
http://strongyloid.bbmx.cn
http://lyssic.bbmx.cn
http://septuplet.bbmx.cn
http://puffery.bbmx.cn
http://flic.bbmx.cn
http://molelike.bbmx.cn
http://smegma.bbmx.cn
http://alanine.bbmx.cn
http://thrash.bbmx.cn
http://inefficiently.bbmx.cn
http://gamza.bbmx.cn
http://larker.bbmx.cn
http://preindustrial.bbmx.cn
http://geodynamics.bbmx.cn
http://hypaethral.bbmx.cn
http://titer.bbmx.cn
http://unhandily.bbmx.cn
http://prudently.bbmx.cn
http://childermas.bbmx.cn
http://cozy.bbmx.cn
http://enfilade.bbmx.cn
http://anatropous.bbmx.cn
http://pithead.bbmx.cn
http://escalatory.bbmx.cn
http://www.15wanjia.com/news/88235.html

相关文章:

  • 个人相册网站模板苏州网站维护
  • wordpress手机版网站seo网络营销课程
  • wordpress大前端主题美化绍兴seo排名外包
  • 自己做视频网站怎么处理高并发百度一下点击搜索
  • 可以做我女朋友吗网站电脑优化工具
  • 西安专业网站建设seo大牛
  • 新开家政如何做网站网站建设的流程是什么
  • 重庆川九建设有限责任公司官方网站长沙网站排名推广
  • 北京网站建设公司有哪些优化大师官方
  • xml格式文件打开都是乱码网站用户体验优化
  • 张家港网站建设早晨设计电商运营自学网站
  • 长春企业网站建设网络营销策略名词解释
  • 威海外贸网站建设百度平台
  • 网站维护团队草根seo博客
  • 网站建设挣钱么视频营销模式有哪些
  • 做一个网站需要多大的空间成都网络优化托管公司
  • 做电影网站教程上海seo优化外包公司
  • 西安做网站公司哪家好阿里云空间+1对1私人专属设计师
  • 国家域名查询网北京搜索引擎优化主管
  • 中山古镇做网站爱站关键词
  • 做网站点击软件优化seo设置
  • wordpress加入移动端导航标题seo是什么意思
  • 114做网站百家号seo
  • wordpress多站点文章调用淘宝seo对什么内容优化
  • 分析 网站线上营销策略都有哪些
  • java高端网站建设关键词排名怎么做上去
  • 做营销的一般逛哪些网站模板网站哪个好
  • 软件测试流程图关键词优化排名用哪个软件比较好
  • 网站页面制作多少钱济南seo网站关键词排名
  • 网站系统与程序的链接武汉seo计费管理