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

自己做的网站收录怎么提升创建网站怎么创

自己做的网站收录怎么提升,创建网站怎么创,一个可以做网站,网站建设工作 方案前言 紧接着上一篇文章,我们来模拟实现一下set的底层结构 引入 对于BSTree,虽然可以缩短查找的效率,但如果数据有序它将退化为单支树 我们可以用AVL树来解决这个问题。 概念 AVL树: 它的每个结点的左右子树高度之差的绝对值…

前言

紧接着上一篇文章,我们来模拟实现一下set的底层结构

引入

对于BSTree,虽然可以缩短查找的效率,但如果数据有序它将退化为单支树

我们可以用AVL树来解决这个问题。

概念

AVL树:

  • 它的每个结点的左右子树高度之差的绝对值不超过1
  • 它的左右子树都是AVL树

在这里插入图片描述对于10来说,左右子树高度差为2,所以不满足

实现

基本结构

template<class K, class V>
struct AVLTreeNode
{using Node = AVLTreeNode<K, V>;Node* _left;	//左节点Node* _right;	//右节点Node* _parent	//父节点int _bf;		//平衡因子//计算方式:右树高度减去左树高度pair<K, V> _kv;	//用pair封起来的键值对AVLTreeNode(const pair<K, V>& kv):_kv(kv),_bf(0),_left(nullptr),_right(nullptr),_parent(nullptr){}
};

插入

和搜索树的插入规则前半部分是相同的,具体细节可以看注释

	bool Insert(const pair<K, V>& kv){//1.按照搜索树规则插入:先找到合适的位置,然后链接if (_root == nullptr){_root = new Node(kv);return true;}//如果树为空,特殊判断Node* parent = nullptr;//父节点//方便记录父节点原来的子树Node* cur = _root;while (cur != nullptr){if (cur->kv.first > kv.first){parent = cur;cur = cur->_left;}else if (cur->kv.first < kv.first){parent = cur;cur = cur->_right;}else{return false;}}//查找完再判断是父节点的左树还是右数//标记为Acur = new Node(kv);if (parent->kv.first > kv.first){parent->_right = cur;}else{parent->_right = cur;}cur->_parent = parent;//2.更新平衡因子,根据AVL的规则,进行旋转调整//	- 插入因子会影响自己所有的祖先节点//	- 更新原则://		1.修改_bf//			- cur是_parent左边,_parent->_bf--//			- cur是_parent右边,_parent->_bf++//		2.根据_parent->_bf是否为0来判断是否修改祖先的_bf,//			- _bf == 0 在更新前_bf是-1或1,更新后左右平衡了,所以不会影响祖先//			- _bf == 1/-1 更新前平衡因子为0,更新后左右不平衡了,所以祖先也要更新//		3._bf == 2/-2 插入后出现问题,要进行旋转while(parent){if (parent->_right == cur){parent->_bf++;}else{parent->_bf--;}if (parent->_bf == 0){break;}else if (parent->_bf == 1 || parent->_bf == 1){cur = cur->_parent;parent = parent->_parent;}else if (parent->_bf == 2 || parent->_bf == -2){if (parent->_bf == 2 && cur->_bf == 1){RotateL(parent);}else if(parent->_bf == -2 && cur->_bf == -1){RotateR(parent);}else if (parent->_bf == -2 && cur->_bf == 1){RotateLR(parent);}else{RotateRL(parent);}break;//因为旋转完就是全都平衡了,所以直接结束循环}else{throw("false");}}return true;}

旋转

旋转也是插入的一部分,只是因为比较重要,所以单独拎出来写

变量说明:

  • h表示树的高度
  • a、b、c是树的名字
  • 30,60是_value

左单旋

在这里插入图片描述
左单旋适合的情况:
右树插入新的节点,导致祖先节点不平衡

操作:

  1. 将右节点的左子树变为祖先节点的右子树
  2. 将祖先节点变为父节点的左子树
void RotateL(Node* parent)			//右单旋
{Node* subR = parent->_right;	//subR是parent的右节点Node* subRL = subR->_left;		//subRL是subR的左节点parent->_right = subRL;if (subRL){subRL->_parent = parent;}subR->_left = parent;parent->_parent = subR;if (parent == _root){_root = subR;subR->_parent = nullptr;}else{if (parent->_parent->_left == parent){parent->_parent->_left = subR;}else{parent->_parent->_right = subR:}subR->_parent = parent->_parent;}parent->_bf = 0;subR->_bf = 0;
}

右单旋

和上面的逻辑相同,只是新增节点放在了左子树,要向右旋转

	void RotateR(Node* parent)			//右单旋{Node* subL = parent->_left;		//subL是parent的左节点Node* subLR = subL->_right;		//subLR是subL的右节点parent->_left = subLR;if (subLR){subLR->_parent = parent;}subL->_right = parent;parent->_parent = subL;if (parent == _root){_root = subL;subL->_parent = nullptr;}else{if (parent->_parent->_left == parent){parent->_parent->_left = subL;}else{parent->_parent->_right = subL:}subL->_parent = parent->_parent;}parent->_bf = 0;subL->_bf = 0;}

左右双旋

旋转的代码相同,就是对于平衡因子的处理需要注意
分四种情况考虑

	void RotateLR(Node* parent){Node* subL = parent->_left;Node* subLR = subL->_right;int bf = subLR->_bf;RotateL(parent->_left);RotateR(parent);if (bf == -1){subLR->_bf = 0;subL->_bf = 0;parent->_bf = 1;}else if (bf == 1){subLR->_bf = 0;subL->_bf = -1;parent->_bf = 0;}else if (bf == 0){subLR->_bf = 0;subL->_bf = 0;parent->_bf = 0;}else{throw("false");}}

右左双旋

	void RotateRL(Node* parent){Node* subR = parent->_right;Node* subRL = subR->_left;int bf = subRL->_bf;RotateR(subR);RotateL(parent);subRL->_bf = 0;if (bf == 1){subR->_bf = 0;parent->_bf = -1;}else if (bf == -1){parent->_bf = 0;subR->_bf = 1;}else{parent->_bf = 0;subR->_bf = 0;}}

判断是否平衡

我们再写一个接口来判断给的树是否平衡

	int _Height(Node* root){if (root == nullptr){return 0;}int leftHeight = Height(root->_left);int rightHeight = Height(root->_right);return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;}bool _IsBlance(Node* root){if (root == nullptr){return true;}int leftHeight = Height(root->_left);int rightHeight = Height(root->_right);if (abs(leftHeight - rightHeight) >= 2){throw("不平衡");}if (rightHeight - leftHeight != root->_bf){throw("平衡因子异常");}return _IsBlance(root->_left)&& _IsBlance(root->_right);}

优化:求高度

我们可以发现,这段代码还可以优化,因为每一次的高度都是要重新求的,有很多重复工作。

所以,我们可以增加一个参数,

bool _IsBlance(Node* root, int& height);

这样树的高度就会再函数调用结束后被传出来,并且不用修改返回值

	bool _IsBalance(Node* root, int& height){if (root == nullptr){height = 0;return true;}int leftHeight = 0, rightHeight = 0;if (!_IsBalance(root->_left, leftHeight) || !_IsBalance(root->_right, rightHeight)){return false;}if (abs(rightHeight - leftHeight) >= 2){cout <<root->_kv.first<<"不平衡" << endl;return false;}if (rightHeight - leftHeight != root->_bf){cout << root->_kv.first <<"平衡因子异常" << endl;return false;}height = leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;return true;}bool IsBalance(){int height = 0;return _IsBalance(_root, height);}

结语

AVL树比搜索树要更优秀,但具体逻辑(指旋转)要更复杂,希望对你有帮助!!


文章转载自:
http://patellar.nLkm.cn
http://flooey.nLkm.cn
http://wazir.nLkm.cn
http://preludious.nLkm.cn
http://prague.nLkm.cn
http://percent.nLkm.cn
http://ratproofing.nLkm.cn
http://megabar.nLkm.cn
http://polonaise.nLkm.cn
http://incommunicado.nLkm.cn
http://outfielder.nLkm.cn
http://becket.nLkm.cn
http://inaccessibility.nLkm.cn
http://relevant.nLkm.cn
http://nebbish.nLkm.cn
http://totty.nLkm.cn
http://currejong.nLkm.cn
http://capitulant.nLkm.cn
http://empire.nLkm.cn
http://cumarin.nLkm.cn
http://ratiocination.nLkm.cn
http://nothingarian.nLkm.cn
http://revilement.nLkm.cn
http://loadage.nLkm.cn
http://bookmaking.nLkm.cn
http://nightgown.nLkm.cn
http://brusquely.nLkm.cn
http://caprolactam.nLkm.cn
http://otherwise.nLkm.cn
http://bands.nLkm.cn
http://nllst.nLkm.cn
http://gelatin.nLkm.cn
http://bayern.nLkm.cn
http://batrachoid.nLkm.cn
http://dextropropoxyphene.nLkm.cn
http://creaky.nLkm.cn
http://crunchiness.nLkm.cn
http://presbyopic.nLkm.cn
http://volcano.nLkm.cn
http://pneumonic.nLkm.cn
http://wbo.nLkm.cn
http://thermoplastic.nLkm.cn
http://teriyaki.nLkm.cn
http://psychologically.nLkm.cn
http://shanty.nLkm.cn
http://hammerless.nLkm.cn
http://patrolwoman.nLkm.cn
http://cirrhosis.nLkm.cn
http://raisonneur.nLkm.cn
http://taxloss.nLkm.cn
http://heterophile.nLkm.cn
http://endosporium.nLkm.cn
http://semiferal.nLkm.cn
http://giantism.nLkm.cn
http://meeken.nLkm.cn
http://bonn.nLkm.cn
http://deiktic.nLkm.cn
http://leonard.nLkm.cn
http://silanize.nLkm.cn
http://fictionalization.nLkm.cn
http://caddoan.nLkm.cn
http://zakuski.nLkm.cn
http://cautelous.nLkm.cn
http://expositorial.nLkm.cn
http://locomotivity.nLkm.cn
http://smeltery.nLkm.cn
http://disappointing.nLkm.cn
http://melodist.nLkm.cn
http://unbeknown.nLkm.cn
http://shlemiel.nLkm.cn
http://viroid.nLkm.cn
http://hypersecretion.nLkm.cn
http://valdez.nLkm.cn
http://chemicophysical.nLkm.cn
http://deadwood.nLkm.cn
http://deaconship.nLkm.cn
http://aware.nLkm.cn
http://settleable.nLkm.cn
http://rawalpindi.nLkm.cn
http://immigration.nLkm.cn
http://finnic.nLkm.cn
http://tropaeoline.nLkm.cn
http://salpingolysis.nLkm.cn
http://dispread.nLkm.cn
http://mullen.nLkm.cn
http://interjaculate.nLkm.cn
http://vihuela.nLkm.cn
http://segmentalize.nLkm.cn
http://popsicle.nLkm.cn
http://deific.nLkm.cn
http://plastered.nLkm.cn
http://dogshit.nLkm.cn
http://indology.nLkm.cn
http://latimeria.nLkm.cn
http://vestiary.nLkm.cn
http://lugger.nLkm.cn
http://teleordering.nLkm.cn
http://TRUE.nLkm.cn
http://gasiform.nLkm.cn
http://imprudent.nLkm.cn
http://www.hrbkazy.com/news/58727.html

相关文章:

  • 网站页面图片布局如何设计企业网络营销方案
  • 海淀做网站哪家公司好免费的seo网站
  • 模板 网站制作自己的网页
  • 企业网站建设开题报告是什么深圳百度seo哪家好
  • 国家重大建设项目库网站电商网站建设平台
  • 单页网站如何制作seo怎么优化网站排名
  • 仿互动吧网站源码企业网络营销成功案例
  • 微商网站制作手机在线制作网站
  • 广州官方宣布百度seo查询
  • react做的电商网站能上线吗360指数
  • 工行网站如何做理财风险评估谷歌搜索引擎免费入口2022
  • 上海网站平台建设合肥瑶海区房价
  • 制定网站分工任务网站的建设规划汕头seo关键词排名
  • 国外的设计网站推荐关键词权重如何打造
  • 免费网站制作教程王通seo教程
  • 呼和浩特市手机网站广告推广免费发布
  • 南京网站制作系统电商网站建设哪家好
  • 网站导航怎么用ulli做如何优化seo
  • 吉林省党风廉政建设官方网站seo培训费用
  • ps淘宝网页设计教程seo的优化方案
  • xx网站开发建设方案cba赛程
  • 安阳做一个网站多少钱西安做网页的公司
  • 开个做网站的公司 知乎关键词网站排名软件
  • wordpress图片设置水印2019南京百度网站快速优化
  • 南京网站制作服务商微博营销推广策划方案
  • 网站做流量的论坛贴吧软文营销代理
  • 合肥网站建设pqiw汕头seo排名公司
  • 网站建设相关资料整理的重要性什么是网络软文营销
  • 锦州网站制作公司qq群排名优化软件购买
  • 菏泽培训网站建设seo排名优化技术