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

电商网站怎么做CSS中国职业培训在线平台

电商网站怎么做CSS,中国职业培训在线平台,施工员证报名入口官网,丹徒网站建设服务文章目录 一、红黑树1.1红黑树的规则:1.2红黑树的插入操作1.2.1不需要旋转(如果叔叔存在且为红,这里的C表示孩子,P表示父亲,U表示叔叔,G表示祖父),包含四种情况,无论孩子在哪里&…

文章目录

    • 一、红黑树
      • 1.1红黑树的规则:
      • 1.2红黑树的插入操作
        • 1.2.1不需要旋转(如果叔叔存在且为红,这里的C表示孩子,P表示父亲,U表示叔叔,G表示祖父),包含四种情况,无论孩子在哪里,都是只需要改变叔叔和父亲的颜色为黑,祖父为红,然后向上继续走,C = G
        • 1.2.2需要旋转(左旋,右旋,左右双旋,右左双旋),叔叔不存在或者为黑
      • 1.2红黑树的插入代码
      • 1.3红黑树的整体框架
    • 二、map、set的底层封装
      • 2.1set的底层封装
      • 2.2map的底层封装
      • 2.3红黑树的底层封装

一、红黑树

相较于前面的AVL树,红黑树的优势是:旋转次数减少,效率提高了,同时还保留了AVL树的查找优势

1.1红黑树的规则:

1.每个节点不是红色就是黑色
2.红色节点的孩子一定是黑色节点
3.不能有连续的红色节点
4.每条路径(走到空为止)上的黑色节点数量相同
5.最短路径<=最长路径<=2
最短路径(当某条路径只有黑色节点,而另一条路径红色节点数量和黑色节点相同,那么最长路径就是最短路路径的两倍)

1.2红黑树的插入操作

1.2.1不需要旋转(如果叔叔存在且为红,这里的C表示孩子,P表示父亲,U表示叔叔,G表示祖父),包含四种情况,无论孩子在哪里,都是只需要改变叔叔和父亲的颜色为黑,祖父为红,然后向上继续走,C = G

在这里插入图片描述

1.2.2需要旋转(左旋,右旋,左右双旋,右左双旋),叔叔不存在或者为黑

右旋的情况(这里省略了C,P,U所连的节点)

在这里插入图片描述
左右双旋的情况(这里省略了C,P,U所连的节点)
在这里插入图片描述
下面两种情况省略

1.2红黑树的插入代码

	bool Insert(const pair<K, V>& data){if (_root == nullptr){_root = new Node(data);_root->_col = BLACK;return true;}Node* cur = _root;Node* parent = nullptr;while (cur){if (data.first > cur->_data.first){parent = cur;cur = cur->_right;}else if (data.first < cur->_data.first){parent = cur;cur = cur->_left;}elsereturn false;}cur = new Node(data);if (parent->_data.first > cur->_data.first)parent->_left = cur;elseparent->_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->_col = parent->_col = BLACK;grandfather->_col = RED;cur = grandfather;//继续向上处理parent = cur->_parent;}else{if (cur == parent->_left){//叔叔为黑或者叔叔不存在RotateR(grandfather);parent->_col = BLACK;grandfather->_col = RED;}else{RotateL(parent);RotateR(grandfather);cur->_col = BLACK;parent->_col = RED;}break;}}else{Node* uncle = grandfather->_left;if (uncle && uncle->_col == RED){uncle->_col = parent->_col = BLACK;grandfather->_col = RED;cur = grandfather;//继续向上处理parent = cur->_parent;}else{if (cur == parent->_right){RotateL(grandfather);parent->_col = BLACK;grandfather->_col = RED;}else{RotateR(parent);RotateL(grandfather);cur->_col = BLACK;grandfather->_col = RED;}break;}}}_root->_col = BLACK;return true;}void RotateL(Node* parent)
{Node* subR = parent->_right;Node* subRL = subR->_left;parent->_right = subRL;if (subRL)subRL->_parent = parent;Node* ppnode = parent->_parent;subR->_left = parent;parent->_parent = subR;if (ppnode == nullptr){_root = subR;_root->_parent = nullptr;}else{if (ppnode->_left == parent){ppnode->_left = subR;}else{ppnode->_right = subR;}subR->_parent = ppnode;}
}void RotateR(Node* parent)
{Node* subL = parent->_left;Node* subLR = subL->_right;parent->_left = subLR;if (subLR)subLR->_parent = parent;Node* ppnode = parent->_parent;subL->_right = parent;parent->_parent = subL;if (parent == _root){_root = subL;_root->_parent = nullptr;}else{if (ppnode->_left == parent){ppnode->_left = subL;}else{ppnode->_right = subL;}subL->_parent = ppnode;}
}

1.3红黑树的整体框架

#pragma once
#include<iostream>
#include<assert.h>
using namespace std;//颜色定义
enum color
{RED,BLACK
};template<class K,class V>
struct RBTreeNode
{typedef RBTreeNode<K, V> Node;pair<K, V> _data;Node* _left;Node* _right;Node* _parent;color _col;//构造函数RBTreeNode(const pair<K, V>& data):_left(nullptr), _right(nullptr), _parent(nullptr), _col(RED), _data(data){}
};template<class K,class V>
class RBTree
{
public:typedef RBTreeNode<K, V> Node;bool Insert(const pair<K, V>& data){if (_root == nullptr){_root = new Node(data);_root->_col = BLACK;return true;}Node* cur = _root;Node* parent = nullptr;while (cur){if (data.first > cur->_data.first){parent = cur;cur = cur->_right;}else if (data.first < cur->_data.first){parent = cur;cur = cur->_left;}elsereturn false;}cur = new Node(data);if (parent->_data.first > cur->_data.first)parent->_left = cur;elseparent->_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->_col = parent->_col = BLACK;grandfather->_col = RED;cur = grandfather;//继续向上处理parent = cur->_parent;}else{if (cur == parent->_left){//叔叔为黑或者叔叔不存在RotateR(grandfather);parent->_col = BLACK;grandfather->_col = RED;}else{RotateL(parent);RotateR(grandfather);cur->_col = BLACK;parent->_col = RED;}break;}}else{Node* uncle = grandfather->_left;if (uncle && uncle->_col == RED){uncle->_col = parent->_col = BLACK;grandfather->_col = RED;cur = grandfather;//继续向上处理parent = cur->_parent;}else{if (cur == parent->_right){RotateL(grandfather);parent->_col = BLACK;grandfather->_col = RED;}else{RotateR(parent);RotateL(grandfather);cur->_col = BLACK;grandfather->_col = RED;}break;}}}_root->_col = BLACK;return true;}void Inorder(){_Inorder(_root);}private:void _Inorder(Node* root){if (root == nullptr)return;_Inorder(root->_left);cout << root->_data.first << endl;_Inorder(root->_right);}void RotateL(Node* parent){Node* subR = parent->_right;Node* subRL = subR->_left;parent->_right = subRL;if (subRL)subRL->_parent = parent;Node* ppnode = parent->_parent;subR->_left = parent;parent->_parent = subR;if (ppnode == nullptr){_root = subR;_root->_parent = nullptr;}else{if (ppnode->_left == parent){ppnode->_left = subR;}else{ppnode->_right = subR;}subR->_parent = ppnode;}}void RotateR(Node* parent){Node* subL = parent->_left;Node* subLR = subL->_right;parent->_left = subLR;if (subLR)subLR->_parent = parent;Node* ppnode = parent->_parent;subL->_right = parent;parent->_parent = subL;if (parent == _root){_root = subL;_root->_parent = nullptr;}else{if (ppnode->_left == parent){ppnode->_left = subL;}else{ppnode->_right = subL;}subL->_parent = ppnode;}}Node* _root = nullptr;
};

二、map、set的底层封装

这里我们需要加上迭代器和仿函数(为了套用同一个红黑树的模版)
map有两个模版参数、set只有一个模版参数,因此我们需要加一个仿函数来确定是map还是set

2.1set的底层封装

namespace SF
{//仿函数template<class K>class set{struct SetKeyOfT{const K& operator()(const K& key){return key;}};public:typedef typename RBTree<K,const K, SetKeyOfT>::iterator iterator;iterator begin(){return _t.begin();}iterator end(){return _t.end();}bool insert(const K& key){return _t.Insert(key);}private:RBTree<K,const K, SetKeyOfT> _t;};
}

2.2map的底层封装

namespace SF
{template<class K,class V> class map{struct MapKeyOfT{const K& operator()(const pair<K,V>& kv){return kv.first;}};public:typedef typename RBTree<K, pair<const K, V>, MapKeyOfT>::iterator iterator;iterator begin(){return _t.begin();}iterator end(){return _t.end();}bool insert(const pair<K,V>& data){return _t.Insert(data);}private:RBTree<K, pair<const K, V>, MapKeyOfT> _t;};
}

2.3红黑树的底层封装

#pragma once
#include<vector>enum Colour
{RED,BLACK
};template<class T>
struct RBTreeNode
{RBTreeNode<T>* _left;RBTreeNode<T>* _right;RBTreeNode<T>* _parent;Colour _col;T _data;RBTreeNode(const T& data):_left(nullptr), _right(nullptr), _parent(nullptr), _data(data), _col(RED){}
};template<class T>
struct RBTreeIterator
{typedef RBTreeNode<T> Node;typedef RBTreeIterator<T> Self;Node* _node;RBTreeIterator(Node* node):_node(node){}T& operator*(){return _node->_data;}T* operator->(){return &_node->_data;}Self& operator++(){if (_node->_right){// 右子树的中序第一个(最左节点)Node* subLeft = _node->_right;while (subLeft->_left){subLeft = subLeft->_left;}_node = subLeft;}else{// 祖先里面孩子是父亲左的那个Node* cur = _node;Node* parent = cur->_parent;while (parent && cur == parent->_right){cur = parent;parent = cur->_parent;}_node = parent;}return *this;}Self& operator--(){// return *this;}bool operator!=(const Self& s){return _node != s._node;}bool operator== (const Self & s){return _node == s._node;}
};// set->RBTree<K, K, SetKeyOfT>
// map->RBTree<K, pair<K, V>, MapKeyOfT>// KeyOfT仿函数 取出T对象中的key
template<class K, class T, class KeyOfT>
class RBTree
{typedef RBTreeNode<T> Node;
public:typedef RBTreeIterator<T> iterator;iterator begin(){Node* subLeft = _root;while (subLeft && subLeft->_left){subLeft = subLeft->_left;}return iterator(subLeft);}iterator end(){return iterator(nullptr);}bool Insert(const T& data){if (_root == nullptr){_root = new Node(data);_root->_col = BLACK;return true;}KeyOfT kot;Node* parent = nullptr;Node* cur = _root;while (cur){if (kot(cur->_data) < kot(data)){parent = cur;cur = cur->_right;}else if (kot(cur->_data) > kot(data)){parent = cur;cur = cur->_left;}else{return false;}}cur = new Node(data); // 红色的if (kot(parent->_data) < kot(data)){parent->_right = cur;}else{parent->_left = 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){// 变色parent->_col = uncle->_col = BLACK;grandfather->_col = RED;// 继续往上处理cur = grandfather;parent = cur->_parent;}else{// 情况二:叔叔不存在或者存在且为黑// 旋转+变色if (cur == parent->_left){//       g//    p    u// cRotateR(grandfather);parent->_col = BLACK;grandfather->_col = RED;}else{//       g//    p     u//      cRotateL(parent);RotateR(grandfather);cur->_col = BLACK;grandfather->_col = RED;}break;}}else{Node* uncle = grandfather->_left;// 情况一:叔叔存在且为红if (uncle && uncle->_col == RED){// 变色parent->_col = uncle->_col = BLACK;grandfather->_col = RED;// 继续往上处理cur = grandfather;parent = cur->_parent;}else{// 情况二:叔叔不存在或者存在且为黑// 旋转+变色//      g//   u     p//            cif (cur == parent->_right){RotateL(grandfather);parent->_col = BLACK;grandfather->_col = RED;}else{//		g//   u     p//      cRotateR(parent);RotateL(grandfather);cur->_col = BLACK;grandfather->_col = RED;}break;}}}_root->_col = BLACK;return true;}void RotateL(Node* parent){Node* subR = parent->_right;Node* subRL = subR->_left;parent->_right = subRL;if (subRL)subRL->_parent = parent;subR->_left = parent;Node* ppnode = parent->_parent;parent->_parent = subR;if (parent == _root){_root = subR;subR->_parent = nullptr;}else{if (ppnode->_left == parent){ppnode->_left = subR;}else{ppnode->_right = subR;}subR->_parent = ppnode;}}void RotateR(Node* parent){Node* subL = parent->_left;Node* subLR = subL->_right;parent->_left = subLR;if (subLR)subLR->_parent = parent;subL->_right = parent;Node* ppnode = parent->_parent;parent->_parent = subL;if (parent == _root){_root = subL;subL->_parent = nullptr;}else{if (ppnode->_left == parent){ppnode->_left = subL;}else{ppnode->_right = subL;}subL->_parent = ppnode;}}private:Node* _root = nullptr;
};

文章转载自:
http://dinncocrystalloid.wbqt.cn
http://dinncoguanaco.wbqt.cn
http://dinncohood.wbqt.cn
http://dinncooverstate.wbqt.cn
http://dinncocallithump.wbqt.cn
http://dinncoevanish.wbqt.cn
http://dinncocavalla.wbqt.cn
http://dinncopinko.wbqt.cn
http://dinncodecameter.wbqt.cn
http://dinncohupeh.wbqt.cn
http://dinncoemblemize.wbqt.cn
http://dinncomontera.wbqt.cn
http://dinncoopt.wbqt.cn
http://dinncoruskinian.wbqt.cn
http://dinncodecreasingly.wbqt.cn
http://dinncoscorify.wbqt.cn
http://dinncochloroethylene.wbqt.cn
http://dinncopleuroperitoneal.wbqt.cn
http://dinncotrial.wbqt.cn
http://dinncoturkmen.wbqt.cn
http://dinncomasker.wbqt.cn
http://dinncoleukodystrophy.wbqt.cn
http://dinncodiction.wbqt.cn
http://dinncochinese.wbqt.cn
http://dinncogoshen.wbqt.cn
http://dinncocontrapposto.wbqt.cn
http://dinncoyestereven.wbqt.cn
http://dinncocyanobacterium.wbqt.cn
http://dinncoelectrofishing.wbqt.cn
http://dinncointerfoliar.wbqt.cn
http://dinncokirghizian.wbqt.cn
http://dinncomonogram.wbqt.cn
http://dinncoforeshots.wbqt.cn
http://dinncoconstrain.wbqt.cn
http://dinncogazer.wbqt.cn
http://dinncocarnelian.wbqt.cn
http://dinncogramme.wbqt.cn
http://dinncosigillographer.wbqt.cn
http://dinncoineloquent.wbqt.cn
http://dinncopomiculture.wbqt.cn
http://dinncofossilization.wbqt.cn
http://dinncotranslucency.wbqt.cn
http://dinncononreliance.wbqt.cn
http://dinncoherpetic.wbqt.cn
http://dinncoretrogress.wbqt.cn
http://dinncophene.wbqt.cn
http://dinncointerpolated.wbqt.cn
http://dinncobiz.wbqt.cn
http://dinncopredepression.wbqt.cn
http://dinncojurisconsult.wbqt.cn
http://dinncoarchdukedom.wbqt.cn
http://dinncothrasher.wbqt.cn
http://dinncoambulate.wbqt.cn
http://dinncocameroun.wbqt.cn
http://dinncobss.wbqt.cn
http://dinncosiddown.wbqt.cn
http://dinncosalvageable.wbqt.cn
http://dinncomosque.wbqt.cn
http://dinncoindevotion.wbqt.cn
http://dinncoreconditely.wbqt.cn
http://dinncolaze.wbqt.cn
http://dinncoibibio.wbqt.cn
http://dinncoba.wbqt.cn
http://dinncostringer.wbqt.cn
http://dinncoreformulation.wbqt.cn
http://dinncofirebird.wbqt.cn
http://dinncoectocrine.wbqt.cn
http://dinncofirst.wbqt.cn
http://dinncoorthicon.wbqt.cn
http://dinncoamagasaki.wbqt.cn
http://dinncochiefy.wbqt.cn
http://dinncobrusque.wbqt.cn
http://dinncoolympia.wbqt.cn
http://dinncopolychloroprene.wbqt.cn
http://dinncohypoxemia.wbqt.cn
http://dinncorescript.wbqt.cn
http://dinncoincorrigibility.wbqt.cn
http://dinncospermatogenesis.wbqt.cn
http://dinncomegalopsia.wbqt.cn
http://dinncomontan.wbqt.cn
http://dinncoanagram.wbqt.cn
http://dinncohydrolyze.wbqt.cn
http://dinncosurrebuttal.wbqt.cn
http://dinncodisputably.wbqt.cn
http://dinncoreslush.wbqt.cn
http://dinncofuel.wbqt.cn
http://dinncokatangese.wbqt.cn
http://dinncotrematode.wbqt.cn
http://dinncostaggering.wbqt.cn
http://dinncofearless.wbqt.cn
http://dinncozythum.wbqt.cn
http://dinncounstalked.wbqt.cn
http://dinncotalofibular.wbqt.cn
http://dinncospasm.wbqt.cn
http://dinncolitigable.wbqt.cn
http://dinncosoerakarta.wbqt.cn
http://dinncopreheating.wbqt.cn
http://dinncoportliness.wbqt.cn
http://dinncosoftening.wbqt.cn
http://dinncopremonstratensian.wbqt.cn
http://www.dinnco.com/news/158313.html

相关文章:

  • phpcms v9怎么做网站seo运营专员
  • 网站如何做宣传百度网盘下载官网
  • 怎么做好手机网站开发凡科建站官网入口
  • 建立自己的影视网站厦门网络推广外包
  • 北京企业网站建设方如何快速搭建网站
  • 河北seo优化seo建站教程
  • 在线a视频网站一级a做爰片长沙关键词优化方法
  • 网站编程设计心得体会seo哪家好
  • 济南做网站最好的公司重庆百度推广开户
  • 网站描述设置百度小说排行
  • 单页网站域名成都网站快速排名软件
  • 长春政府网站开发百度快照不更新怎么办
  • 设计云黑帽seo技术论坛
  • 阿里邮箱 网站开发seo网站诊断流程
  • 做网站提成营销软文范例大全100
  • 亚马逊网站怎么做泉州百度竞价开户
  • 外贸网站用什么空间写软文平台
  • 公司做网站一般要多少钱升华网络推广软件
  • 网站建设都需要什么工具seo服务商技术好的公司
  • 网站开发报价技巧html网站模板免费
  • wordpress 更新用户名宁波seo外包费用
  • 深圳设计网站公司网站宁德市人民医院
  • 做投票链接的网站市场监督管理局官网入口
  • 做时时彩网站赚钱有效的网络推广
  • 松江品划网站建设推广百度seo价格
  • 智能建站软件百度网页入口
  • 中国最近战争新闻快速排名优化系统
  • 网站下载小说seo优化对网店的推广的作用为
  • 南京明月建设集团网站口碑营销案例
  • 如何修改单页网站互联网服务平台