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

律师网站建设怎么样线上推广有哪些

律师网站建设怎么样,线上推广有哪些,采购平台,网站设计和建设AVL树的出现主要是解决在一些特定情况下的搜索二叉树出现的效率低的问题,因为在一些极端情况下,搜索二叉树的形况可能会发生一些变异,例如下面的情况。从而影响整个数据结构的效率; AVL树通过在节点中引出平衡因子,再插…

        AVL树的出现主要是解决在一些特定情况下的搜索二叉树出现的效率低的问题,因为在一些极端情况下,搜索二叉树的形况可能会发生一些变异,例如下面的情况。从而影响整个数据结构的效率;

        AVL树通过在节点中引出平衡因子,再插入过程中自适应调节平衡因子,从而使树达到平衡状态 。平衡因子的定义:一个根节点的平衡因子=右子树的高度-左子树的高度;AVL树的要求是每一个节点的平衡因子只能是(-1/0/1);如果平衡因子发生变化,那么就要进行自适应调整。

1、节点的设计

template<class K, class V>
struct AVLTreeNode
{pair<K, V> _kv;AVLTreeNode<K,V>* _left;AVLTreeNode<K, V>* _right;AVLTreeNode<K, V>* _parent;int _bf;AVLTreeNode(const pair<K, V>& kv):_kv(kv),_left(nullptr),_right(nullptr),_parent(nullptr),_bf(0){}};

        节点内部存放是键对,仿照STL标准库的设计。_bf(balance factor)为该节点的饿平衡因子;

数中引入_parent,主要是将节点设计成三叉链的形式,便于后面的平衡因子的更新。

2、节点的插入

        节点的插入部分前面类似于搜索二叉树的插入,只不过就是要在插入之后进行平衡因子的控制;这里给出插入的一般逻辑:

template<class K,class V>
class AVLTree
{typedef AVLTreeNode<K, V> Node;
public:bool Insert(const pair<K, V>& kv){if (_root == nullptr){_root = new Node(kv);return true;}Node* cur = _root;Node* parent = nullptr;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->_left = cur;}else{parent->_right = cur;}cur->_parent = parent;//控制平衡...return true;}private:Node* _root = nullptr;
};

1、下面需要着重讨论怎么去控制平衡问题:

首先需要明确的是,插入的节点的平衡因子一定为0,它的父节点的平衡因子是一定要进行更新的。问题是,父节点的更新之后要不要沿着祖先的路径接着向上继续更新呢?

        就像上面的情况,当更新到父亲节点的平衡因子为0是就可以停止了。这是因为如果一个父节点的平衡因子为0,那就说明在插入新的节点之后,它的左右子树的高度没有发生变化。所以它不会影响他的父亲节点的平衡因子。因此这种情况下就可以直接停止更新行为;

2、平衡因子需要更新这点很清楚,那么怎么去更新呢?

        我们可以发现,平衡因子的定义为右子树减去左子树的高度,也就是说当右子树的高度增加之后,平衡因子就会+1,左子树的高高度增加之后,平衡因子就会-1;通过这个特性进行平衡因子的更新。这里肯定需要用到循环,那么最坏的情况下父亲节点走到根节点的位置更新之后就不用更新了,也就说父节点一旦为空更新就终止了;

3、下面探讨更新的几种情况:

如果父节点的_bf == 1 || _bf == -1时需要沿着祖先的位置进行迭代更新,(直到父节点的_bf == 0);

如果父节点的_bf == 2 || _bf == -2时,这时就需要进旋转;这里需要进行分类讨论:

3.1、左单旋(父节点的平衡因子为2 且 当前节点的平衡因子为1)

        像上面的情况其实是众多情况下的一种具象话实例,要进行左单旋就意味着当前节点的右子树高度明显高于左子树的高度,此时就需要进行调整,达到树的平衡。问题是怎么进行调整呢??

下面,请看图说话:进行左单旋时主要是对粉色的节点进行链接关系的修改;

左单旋完成之后的位置关系:

 我们可以看到实际上就是将cur的左节点链接到parent的右节点上,再将cur的左节点链接到parent上,这样一来,cur和parent的平衡因子自然而然的就达到了平衡条件。所以只需要在左单旋之后对cur和parent的平衡因子直接进行修改即可。前面我们在节点中定义的是三叉链,所以在左单旋的过程中也要对每个节点的父亲节点进行更新。

void RotateL(Node* parent)
{Node* cur = parent->_right;Node* curLeft = cur->_left;//可能为空,后面需要判断;Node* ppNode = parent->_parent;parent->_right = curLeft;if (curLeft){curLeft->_parent = parent;}cur->_left = parent;    parent->_parent = cur;parent->_bf = cur->_bf = 0;if (parent == _root){_root = cur;cur->_parent = nullptr;}else{//第三种情况,parent上面还有其他节点if (ppNode->_left == parent){ppNode->_left = cur;}else{ppNode->_right = cur;}cur->_parent = ppNode;}
}

3.2 右单旋(父节点的平衡因子为-2 且 当前节点的平衡因子为-1)

        右单旋是因为左子树的高度大于右子树的高度。所以要进行右单旋;

右单旋之后的节点关系:

我们可以看到,其实就是将cur的右子树连接到parent的左子树上,再将parent链接到cur的右子树上,同样就自然而然地 满足cur和parent的平衡因子为0、同样我们在右旋过程中需要更新各个节点的父亲节点;

3.3 右左双旋(父节点的平衡因子为2 且 当前节点的平衡因子为-1)

主要原因是父节点的右子树高于左子树,而当前节点间的左子树高于右子树;

假设新插入的节点在9这个节点的左边:

其实这里就是先进行右旋再进行左旋,只是在旋转之后需要对平衡因子进行更新,这里会有一个问题,就是说在左右旋之后会将三个节点的平衡因子都改为0,但是上面的cur的平衡因子明显为1;

再看下面的情况:

当新插入节点在9的右侧时,最后parent的平衡因子就会变为-1,而其他两个节点的平衡因子为0;

 代码如下:

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

3.3 左右双旋(父节点的平衡因子为-2 且 当前节点的平衡因子为1)

待续...

http://www.dtcms.com/wzjs/591415.html

相关文章:

  • 网站备案登录密码找回课程培训
  • 网站内容怎么选择济南优化网站
  • dede网站怎么更换模板网站建设的资料的准备
  • wordpress开启多站点保险网站排名
  • 企业门户网站建设信息建筑公司名称大全简单大气
  • 攀枝花网站网站建设服务器在国外的网站
  • 达州市住房和建设厅网站网站规划步骤
  • 网站备案是否关闭wordpress付费附件下载
  • 企业网站模板下载网址免费网站建设特色
  • 有没有好一点的网站织梦书法网站模板
  • 阜沙网站建设品牌推广与传播怎么写
  • 移动端网站的重要性企业咨询管理公司是干嘛的
  • 汽车网站排行榜前十名品牌买购网
  • 淄博网站建设hiddd金融app开发
  • 做个公司网站大概多少钱注册一个5000万空壳公司要多少钱
  • 建设网站网页电子商务网站建设实训作业
  • 网站权重能带来什么作用文登区城乡建设局网站
  • 网站建设资讯平台素材网站排行榜前十名
  • 什么是建设网站的主题公司网页设计论文题目大全
  • 网站检测中心辽宁省建设工程造价管理网站
  • 东莞市建设规划局网站首页一笔签名设计在线
  • 南平住房和城乡建设部网站怎样营销网站
  • 建站系统主要包括企业网站系统优惠券小程序源码
  • 郑州快速网站建设wordpress判断文章id
  • 深圳高端集团网站建设公司嘉兴网站制作设计
  • 做外贸哪个网站看外汇什么网站可以做进出口买卖
  • 做网站时的兼容问题域名永久免费注册
  • 七台河建网站推销商务网站的途径有哪些
  • 一个人做电商网站难吗网页设计基础知识总结
  • 公司网站建设成本外贸网站制作公司哪家好