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

网站建设案例包括哪些济南招考院网站

网站建设案例包括哪些,济南招考院网站,网页设计公司杭州,软件外包合同模板前言 有人说设计出AVL树的的人是个大牛#xff0c;那写红黑树#xff08;RBTree#xff09;的人就是天才#xff01; 上一篇文章#xff0c;我们已经学习了AVL树#xff0c;牛牛个人认为AVL树已经够优秀了#xff0c;那让我们一起探究一下#xff0c;为什么红黑树比AV… 前言 有人说设计出AVL树的的人是个大牛那写红黑树RBTree的人就是天才 上一篇文章我们已经学习了AVL树牛牛个人认为AVL树已经够优秀了那让我们一起探究一下为什么红黑树比AVL树的结构还要优秀吧 目录 前言一、红黑树的介绍二、手撕红黑树2.1 框架结构分析2.11 结点颜色2.12 结点类2.13 红黑树结构 2.2 接口实现2.21 插入接口重点情况1 父亲是爷爷的左cur结点是父亲的左。 左左情况2 父亲是爷爷的左cur结点是父亲的右。 左右情况3 父亲是爷爷的右cur结点是父亲的左。 右左情况4 父亲是爷爷的右cur结点是父亲的左。 右右 2.22 最左侧结点LeftMost2.23 最右侧结点RightMost2.24 检测函数次重点2.25 获取根节点2.25 获取红黑树的高度2.26 find函数 三、结语 一、红黑树的介绍 红黑树是一种二叉搜索树但在每个结点上增加一个存储位表示结点的颜色可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制红黑树确保没有一条路径会比其他路径长出俩倍因而是接近平衡的。 红黑树是一种自平衡的二叉查找树它的性质比较复杂但却非常重要常用于C中的STL库中的set、map等容器。红黑树的节点有两种颜色红色red和黑色black。它具有如下五个性质 每个节点是红色或者黑色的。根节点是黑色的。每个叶子节点这里特指最下面的空节点是黑色的。如果一个节点是红色的则它的子节点必须是黑色的。即每条路径上不能出现连续的红结点从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。 由于红色结点的父亲必须是黑色结点并且每条路径上的黑色结点的个数也必须相同所以得到了红黑树最长路径中节点个数不会超过最短路径节点个数的两倍 这也就决定了红黑树的高度是logn级别的。 例如下面这个就是红黑树 二、手撕红黑树 2.1 框架结构分析 2.11 结点颜色 红黑树较于AVL树不在使用平衡因子而是增设了颜色变量这里我们可以枚举出这两种颜色方便使用。 enum Colour //枚举出颜色{RED, //红色BLACK //黑色};2.12 结点类 同AVL树一样红黑树也是三叉链 //结点类templateclass K, class Vstruct RBTreeNode{//指针域RBTreeNodeK, V* _left;RBTreeNodeK, V* _right;RBTreeNodeK, V* _parent;pairK, V _kv; //数据域Colour _Col;RBTreeNode(const pairK, V kv)//构造函数:_left(nullptr), _right(nullptr), _parent(nullptr), _kv(kv), _Col(RED) //注意这里默认新构造的结点是红色的{}};2.13 红黑树结构 //红黑树的结构templateclass K, class Vclass RBTree{typedef RBTreeNodeK, V Node;public:// 在红黑树中插入值为data的节点插入成功返回true否则返回false//此版本红黑树对于重复元素插入失败bool Insert(const pairK, V kv);// 搜索红黑树中是否存在值为data的节点。//存在返回该节点的地址不存在则返回nullptrNode* Find(const pairK, V data);// 获取红黑树最左侧节点Node* LeftMost();// 获取红黑树最右侧节点Node* RightMost();//这里的玩法大家应该不陌生了 int Height();//计算红黑树的高度bool IsValidRBTRee();// 检测红黑树是否为有效的红黑树private:bool _IsValidRBTRee(Node* pRoot, size_t blackCount, size_t pathBlack);int Height(Node* root);// 左单旋void RotateL(Node* pParent);// 右单旋void RotateR(Node* pParent);// 为了操作树简单起见获取根节点Node* GetRoot();private:Node* _root nullptr;};2.2 接口实现 2.21 插入接口重点 本篇主要讲解的部分就是红黑树的插入操作。 函数名 insert返回值插入成功返回true插入失败返回false形参键值对 //插入函数 templateclass K, class V bool RBTreeK, V::Insert(const pairK, V kv) { }1.如果是第一次插入则插入的是根节点则需要特殊处理因为要给根节点root赋值。 在结点类中我们提到在创建的新节点我们给与了默认颜色为RED红色而红黑树的根节点必须是BLACK黑色的这里一定要记得修改一下颜色。 //第一次插入if (_root nullptr) {_root new Node(kv);_root-_Col BLACK; //注意根节点一定是黑色的默认构造的新节点是红色的所以这里要改一下。return true;}(2) 寻找插入位置 红黑树也是二叉搜索树学到这里相信友友们在AVL树和二叉搜索树学习阶段已经知道如何寻找插入位置。 //寻找插入位置while (cur) {parent cur;if (_root-_kv.first kv.first) {cur cur-_left; //插入的值当前结点的值小往左走}else if (_root-_kv.first kv.first) {cur cur-_right; //插入的值当前结点的值大往右走}else {return false; //本篇实现的红黑树对于重复值插入失败}}//判断插入在左边还是右边cur new Node(kv);if (kv.first parent-_kv.first) { //插入在左边parent-_left cur;}else { //插入在右边parent-_right cur;}cur-_parent parent; //保证三叉链的关系3.看uncle叔叔 叔叔uncle这里我将当前结点的父亲parent的兄弟称为叔叔结点。 示例 当我们新增一个结点时默认新节点的颜色为RED如果它的父亲结点是黑色的则不需要做任何调整直接插入成功 当父亲结点是红色的时候则与新增结点一起会构成连续的红色结点此时需要调整。 调整规则主要看uncle叔叔结点。 情况1 父亲是爷爷的左cur结点是父亲的左。 左左 情况叔叔存在且为红 调整方案 变色向上更新图片为博主原创请勿随意转发使用 情况叔叔不存在或者存在且为黑 调整方案 右旋变色 图片为博主原创请勿随意转发使用 情况2 父亲是爷爷的左cur结点是父亲的右。 左右 情况叔叔存在且为红 调整方案 变色向上更新 图片为博主原创请勿随意转发使用 情况叔叔不存在或者存在且为黑 调整方案 左右双旋变色 示例图 图片为博主原创请勿随意转发使用 情况3 父亲是爷爷的右cur结点是父亲的左。 右左 情况叔叔存在且为红 调整方案 变色向上更新 这里不画图了牛牛画累了。 情况叔叔不存在或者存在且为黑 调整方案 右左双旋变色 图片为博主原创请勿随意转发使用 情况4 父亲是爷爷的右cur结点是父亲的左。 右右 情况叔叔存在且为红 调整方案 变色向上更新 图片为博主原创请勿随意转发使用 情况叔叔不存在或者存在且为黑 调整方案 左旋变色 图片为博主原创请勿随意转发使用 总结 红黑树的插入主要看uncle 分为两种情况 1uncle存在且为红 调整方案 变色继续向上调整 2uncle不存在或者uncle存在且为黑 调整方案 旋转变色 至于如何旋转因为红黑树没有采用平衡因子的方式所以我们采用判断grandfather与parent 和 parent与cur的关系结构来决定。 下图是具体调整总结 总代码 bool Insert(const T kv) {if (_root nullptr) {_root new Node(kv);_root-_Col BLACK; //注意根节点一定是黑色的默认构造的新节点是红色的所以这里要改一下。return true;}Node* cur _root, * parent nullptr;//寻找插入位置while (cur) {parent cur;if (_root-_kv.first kv.first) {cur cur-_left;}else if (_root-_kv.first kv.first) {cur cur-_right;}else {return false;}}//判断插入在左边还是右边cur new Node(kv);if (kv.first parent-_kv.first) { //插入在左边parent-_left cur;}else { //插入在右边parent-_right cur;}cur-_parent parent; //保证三叉链的关系//while (parent parent-_Col RED) {//爷爷结点Node* grandfather parent-_parent;if (parent grandfather-_left) { //如果父亲是爷爷的左孩子Node* uncle grandfather-_right; //那么叔叔就是爷爷的右孩子//叔叔存在且为红if (uncle uncle-_Col RED) {//变色uncle-_Colparent-_Col BLACK;grandfather-_Col RED;//继续向上更新cur grandfather;parent grandfather-_parent;}else { //叔叔不存在或者 存在且为黑if (cur parent-_left) { // g// p//cRotateR(grandfather);grandfather-_Col RED;parent-_Col BLACK;}else {// g// p// cRotateL(parent);RotateR(grandfather);cur-_Col BLACK;grandfather-_Col RED;}break; //此时最顶端的结点已经变成黑色了不需要继续向上更新了。}}else { // 如果父亲是爷爷的右孩子Node* uncle grandfather-_left; //那么叔叔就是爷爷的左孩子//叔叔存在且为红if (uncle uncle-_Col RED) {//变色uncle-_Col parent-_Col BLACK;grandfather-_Col RED;//继续向上更新cur grandfather;parent grandfather-_parent;}else { //叔叔不存在或者 存在且为黑if (cur parent-_left) {// g// p// c//注意旋转时的传参RotateR(parent);RotateL(grandfather);grandfather-_Col RED;cur-_Col BLACK;}else {// g// p// cRotateL(grandfather); //注意旋转时的传参parent-_Col BLACK;grandfather-_Col RED;}break; //此时最顶端的结点已经变成黑色了不需要继续向上更新了。}}}_root-_Col BLACK; //最后根节点一定是黑的return true;}2.22 最左侧结点LeftMost 对于二叉搜索树如果我们按中序遍历则可以得到一个有序序列。 中序遍历的首个结点 最左侧结点 中序遍历的最后结点 最右侧结点 // 获取红黑树最左侧节点templateclass K, class Vtypename RBTreeK, V::Node* RBTreeK, V::LeftMost() {Node* left_most _root;while (left_most-left) {left_most left_most-left;}return left_most;}2.23 最右侧结点RightMost // 获取红黑树最右侧节点templateclass K, class Vtypename RBTreeK, V::Node* RBTreeK, V::RightMost() {Node* right_most _root;while (right_most-right) {right_most right_most-left;}return right_most;}2.24 检测函数次重点 在实现红黑树时也许我们会遇到各种问题好不容易跑通代码后我们缺无法判断自己实现的红黑树是否正确是否符合红黑树的规则。 此时我们可以设计一个检测函数检测实现的红黑树是否平衡。 空树也是红黑树根节点必须是红黑树我们可以设置一个“基准值”基准值为红黑树一条路径中的黑色结点的个数。遍历每条红黑树的路径判断红黑树结点的个数是否与基准值相等。除此之外出现连续两个红色结点则返回false。 // 检测红黑树是否为有效的红黑树注意其内部主要依靠_IsValidRBTRee函数检测 templateclass K, class V bool RBTreeK, V::IsValidRBTRee() {if (_root nullptr) //空树也是红黑树return true;if (_root-_Col ! BLACK) //根节点必须是红黑树{return false;}// 基准值int pathBlack 0;Node* cur _root;while (cur){if (cur-_Col BLACK)pathBlack;cur cur-_left;}_IsValidRBTRee(_root, 0, pathBlack); }templateclass K, class V bool RBTreeK, V::_IsValidRBTRee(Node* pRoot, size_t blackCount, size_t pathBlack) {if (pRoot nullptr){if (blackCount ! pathBlack) //一条路径走到底也就是走到叶子结点以后判断这条路径上的黑色结点个数blackCount是否与 设定的黑色结点个数相同pathBlackreturn false;return true;}if (pRoot-_Col BLACK){blackCount;}if (pRoot-_Col RED pRoot-_parent pRoot-_parent-_Col RED){cout _root-_kv.first 出现连续红色节点 endl;return false;}//递归访问左右子树return _IsValidRBTRee(pRoot-_left, blackCount, pathBlack) _IsValidRBTRee(pRoot-_right, blackCount, pathBlack); }2.25 获取根节点 templateclass K, class Vtypename RBTreeK, V::Node* RBTreeK, V::GetRoot() {return _root;}2.25 获取红黑树的高度 templateclass K, class Vint RBTreeK, V::Height(){return Height(_root);}templateclass K, class Vint RBTreeK, V::Height(typename RBTreeK, V::Node* root){if (root nullptr)return 0;int leftHeight Height(root-_left); //计算左子树的高度int rightHeight Height(root-_right); //计算右子树的高度return leftHeight rightHeight ? leftHeight 1 : rightHeight 1;}2.26 find函数 templateclass K, class T, typename RBTreeclass K, class T, class Of_T::Node* RBTreeclass K, class T, class Of_T::Find(const T data) {Node* cur _root;while (cur){if (data cur-_data){cur cur-_right;}else if (data cur-_data){cur cur-_left;}else return cur;}return nullptr; // 找不到目标元素时返回nullptr }三、结语 看完本篇文章我们不难知道对于插入操作无论是红黑树还是avl树要维持对应的“平衡”会进行沿路径的更新其中涉及大量的旋转操作而红黑树较于avl树那种严格的高度差在-1到1之间红黑树的平衡条件相对宽松这也就大大减少了的为了维持平衡的大量旋转操作而且还能保证效率在logN这也就是为啥说红黑树较于avl树更加优秀。 你赞同这个观点吗 后续牛牛会模拟实现map和set会在那篇文章封装红黑树对红黑树进行改造增加迭代器等功能。帮助友友们更加深入理解map和set容器。
文章转载自:
http://www.morning.bkkgt.cn.gov.cn.bkkgt.cn
http://www.morning.csnch.cn.gov.cn.csnch.cn
http://www.morning.trhlb.cn.gov.cn.trhlb.cn
http://www.morning.qsy36.cn.gov.cn.qsy36.cn
http://www.morning.drcnf.cn.gov.cn.drcnf.cn
http://www.morning.wqrk.cn.gov.cn.wqrk.cn
http://www.morning.jhqcr.cn.gov.cn.jhqcr.cn
http://www.morning.pzbqm.cn.gov.cn.pzbqm.cn
http://www.morning.mfltz.cn.gov.cn.mfltz.cn
http://www.morning.qgwpx.cn.gov.cn.qgwpx.cn
http://www.morning.dhyzr.cn.gov.cn.dhyzr.cn
http://www.morning.dlgjdg.cn.gov.cn.dlgjdg.cn
http://www.morning.amlutsp.cn.gov.cn.amlutsp.cn
http://www.morning.qkkmd.cn.gov.cn.qkkmd.cn
http://www.morning.hsjrk.cn.gov.cn.hsjrk.cn
http://www.morning.jfwrf.cn.gov.cn.jfwrf.cn
http://www.morning.rwpjq.cn.gov.cn.rwpjq.cn
http://www.morning.ndngj.cn.gov.cn.ndngj.cn
http://www.morning.nxstj.cn.gov.cn.nxstj.cn
http://www.morning.qgwpx.cn.gov.cn.qgwpx.cn
http://www.morning.tldfp.cn.gov.cn.tldfp.cn
http://www.morning.mnkz.cn.gov.cn.mnkz.cn
http://www.morning.hqlnp.cn.gov.cn.hqlnp.cn
http://www.morning.lbxcc.cn.gov.cn.lbxcc.cn
http://www.morning.wtcbl.cn.gov.cn.wtcbl.cn
http://www.morning.ltksw.cn.gov.cn.ltksw.cn
http://www.morning.nkcfh.cn.gov.cn.nkcfh.cn
http://www.morning.pwksz.cn.gov.cn.pwksz.cn
http://www.morning.rfwrn.cn.gov.cn.rfwrn.cn
http://www.morning.ghcfx.cn.gov.cn.ghcfx.cn
http://www.morning.yhpq.cn.gov.cn.yhpq.cn
http://www.morning.fpzpb.cn.gov.cn.fpzpb.cn
http://www.morning.kwnnx.cn.gov.cn.kwnnx.cn
http://www.morning.fkyqm.cn.gov.cn.fkyqm.cn
http://www.morning.jltmb.cn.gov.cn.jltmb.cn
http://www.morning.jrdbq.cn.gov.cn.jrdbq.cn
http://www.morning.gtylt.cn.gov.cn.gtylt.cn
http://www.morning.rnmdp.cn.gov.cn.rnmdp.cn
http://www.morning.jzsgn.cn.gov.cn.jzsgn.cn
http://www.morning.fxwkl.cn.gov.cn.fxwkl.cn
http://www.morning.btgxf.cn.gov.cn.btgxf.cn
http://www.morning.mxnhq.cn.gov.cn.mxnhq.cn
http://www.morning.mzbyl.cn.gov.cn.mzbyl.cn
http://www.morning.kmqjx.cn.gov.cn.kmqjx.cn
http://www.morning.sxbgc.cn.gov.cn.sxbgc.cn
http://www.morning.sgfnx.cn.gov.cn.sgfnx.cn
http://www.morning.yxbdl.cn.gov.cn.yxbdl.cn
http://www.morning.wjhdn.cn.gov.cn.wjhdn.cn
http://www.morning.lffrh.cn.gov.cn.lffrh.cn
http://www.morning.qrwnj.cn.gov.cn.qrwnj.cn
http://www.morning.ypdmr.cn.gov.cn.ypdmr.cn
http://www.morning.xpzrx.cn.gov.cn.xpzrx.cn
http://www.morning.hfrbt.cn.gov.cn.hfrbt.cn
http://www.morning.rnygs.cn.gov.cn.rnygs.cn
http://www.morning.tnwgc.cn.gov.cn.tnwgc.cn
http://www.morning.tqpnf.cn.gov.cn.tqpnf.cn
http://www.morning.mbqyl.cn.gov.cn.mbqyl.cn
http://www.morning.qkkmd.cn.gov.cn.qkkmd.cn
http://www.morning.wnhgb.cn.gov.cn.wnhgb.cn
http://www.morning.mdmc.cn.gov.cn.mdmc.cn
http://www.morning.tpkxs.cn.gov.cn.tpkxs.cn
http://www.morning.wqcz.cn.gov.cn.wqcz.cn
http://www.morning.nwtmy.cn.gov.cn.nwtmy.cn
http://www.morning.jppdk.cn.gov.cn.jppdk.cn
http://www.morning.wmhlz.cn.gov.cn.wmhlz.cn
http://www.morning.fdrb.cn.gov.cn.fdrb.cn
http://www.morning.fyzsq.cn.gov.cn.fyzsq.cn
http://www.morning.smry.cn.gov.cn.smry.cn
http://www.morning.pkrb.cn.gov.cn.pkrb.cn
http://www.morning.gstg.cn.gov.cn.gstg.cn
http://www.morning.pphbn.cn.gov.cn.pphbn.cn
http://www.morning.leboju.com.gov.cn.leboju.com
http://www.morning.rzmsl.cn.gov.cn.rzmsl.cn
http://www.morning.jlthz.cn.gov.cn.jlthz.cn
http://www.morning.mhpkz.cn.gov.cn.mhpkz.cn
http://www.morning.lnrr.cn.gov.cn.lnrr.cn
http://www.morning.tpssx.cn.gov.cn.tpssx.cn
http://www.morning.wptdg.cn.gov.cn.wptdg.cn
http://www.morning.zttjs.cn.gov.cn.zttjs.cn
http://www.morning.rykmz.cn.gov.cn.rykmz.cn
http://www.tj-hxxt.cn/news/248598.html

相关文章:

  • 网站改版html营销网站手机站
  • 溧阳常州做网站人工智能在未来可以
  • 学校的网站怎么做的泉州seo网站关键词优
  • 中文个人网站模板下载wordpress翻转框
  • 网站建设费用什么意思衡水seo网站建设优化排名
  • 网站做1920px好吗36氪国外做网站
  • 南宁公司做网站wordpress手机端粘性菜单
  • 网站界面设计内容网站建设一条龙怎么样
  • 论坛网站建设用工具软件企业网络推广的方法有哪些
  • 什么叫宣传型网站生成logo的网站
  • wordpress微信插件开发如何优化网页加载速度
  • p2p网站建设cms网站建设经营服务合同范本
  • 网站如何在360做提交wordpress设置静态
  • 大足网站设计原网站开发新功能
  • 网站上传 文件夹结构东莞企业网站教程
  • 建什么网站可以赚钱小程序如何搭建
  • 企业网站搭建多少钱重庆建筑培训网
  • php做的网站怎么调试wordpress全球销量主题
  • 网站制作与管理技术...深圳高端家装公司
  • 做虚假彩票网站判几年怎样创造一个网站
  • 建设网站要求唐山网站关键词优化
  • php成品网站超市化妆品网站栏目设计
  • ps做汽车网站下载石家庄网站开发公司
  • 中国建设银行江西分行网站首页展架设计制作图片
  • 营销网站建设的公司哪家好网站咨询界面设计
  • 江西响应式网站建设广东移动网站
  • 长沙做php的网站建设株洲的网站建设
  • 宽屏网站jswordpress 登陆才能看
  • 网站建设报告 商业价值天水 网站建设招聘
  • 京东pc网站用什么做的怎样给网站登录界面做后台