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

中国建设银行官方网站登录大连网站设计费用

中国建设银行官方网站登录,大连网站设计费用,地方门户网站模板,wordpress主题带手机版1.AVL树的概念 为什么需要产生AVL树,由于二叉树中在某种特殊情况下会出现“一边高”的形状,这对于查找是极为不利的,所以就产生了AVL树。AVL树一棵空树或者具备下列性质的二叉搜索树:左右子树都是AVL树,且左右子树高度…

1.AVL树的概念

  为什么需要产生AVL树,由于二叉树中在某种特殊情况下会出现“一边高”的形状,这对于查找是极为不利的,所以就产生了AVL树。AVL树一棵空树或者具备下列性质的二叉搜索树:左右子树都是AVL树,且左右子树高度差绝对值不超过1。AVL树是一颗高度平衡的二叉搜索树,通过控制高度差来控制平衡。

  AVL树实现需要引用一个平衡因子的概念,每个节点都有一个平衡因子, 任何节点的平衡因⼦等于右⼦树的⾼度减去左⼦树的⾼度,也就是说任何结点的平衡因⼦等于0/1/-1,保证了左右子树高度差绝对值不超过1。

  AVL树整体结点数量和分布和完全⼆叉树类似,⾼度可以控制在 ,那么增删查改的效率也可以控制在O(logN)。

2.AVL树的实现

2.1AVL树的结构

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):_left(nullptr),_right(nullptr),_parent(nullptr),_bf(0){}};template<class K, class V>
class AVLTree
{typedef AVLTreenode<K, V> Node;
public:private:Node* _root = nullptr;
};

2.2 AVL树的插⼊

2.2.1 AVL树插⼊⼀个值的⼤概过程

1.插入值按照二叉树的规则进行插入

2.新增节点以后只会影响祖先的节点,也就是可能会影响部分祖先的节点,最坏情况下会影响到根节点。

3. 更新平衡因⼦过程中没有出现问题,则插⼊结束。

4. 更新平衡因⼦过程中出现不平衡,对不平衡⼦树旋转,旋转后本质调平衡的同时,本质降低了⼦树 的⾼度,不会再影响上⼀层,所以插⼊结束。

2.2.2

平衡因⼦更新

更新原则:

• 平衡因⼦=右⼦树⾼度-左⼦树⾼度

• 只有⼦树⾼度变化才会影响当前结点平衡因⼦。

• 插⼊结点,会增加⾼度,所以新增结点在parent的右⼦树,parent的平衡因⼦++,新增结点在 parent的左⼦树,parent平衡因⼦--

• parent所在⼦树的⾼度是否变化决定了是否会继续往上更新

更新停⽌条件:

• 更新后parent的平衡因⼦等于0,更新中parent的平衡因⼦变化为-1->0或者1->0,说明更新前 parent⼦树⼀边⾼⼀边低,新增的结点插⼊在低的那边,插⼊后parent所在的⼦树⾼度不变,不会 影响parent的⽗亲结点的平衡因⼦,更新结束。

• 更新后parent的平衡因⼦等于1或-1,更新前更新中parent的平衡因⼦变化为0->1或者0->-1,说 明更新前parent⼦树两边⼀样⾼,新增的插⼊结点后,parent所在的⼦树⼀边⾼⼀边低,parent所 在的⼦树符合平衡要求,但是⾼度增加了1,会影响parent的⽗亲结点的平衡因⼦,所以要继续向 上更新。

• 更新后parent的平衡因⼦等于2或-2,更新前更新中parent的平衡因⼦变化为1->2或者-1->-2,说 明更新前parent⼦树⼀边⾼⼀边低,新增的插⼊结点在⾼的那边,parent所在的⼦树⾼的那边更⾼ 了,破坏了平衡,parent所在的⼦树不符合平衡要求,需要旋转处理,旋转的⽬标有两个:1、把 parent⼦树旋转平衡。2、降低parent⼦树的⾼度,恢复到插⼊结点以前的⾼度。所以旋转后也不 需要继续往上更新,插⼊结束。

如图更新到节点十时,平衡因子为2,10所在子树已经不平衡了,需要旋转处理。

2.3旋转

 旋转的原则
1. 保持搜索树的规则
2. 让旋转的树从不满⾜变平衡,其次降低旋转树的⾼度
旋转总共分为四种,左单旋/右单旋/左右双旋/右左双旋。
void RotateL(Node* parent)//左单选{Node* subR = parent->_right;Node* subRL = subR->_left;Node* Pparent = parent->_parent;parent->_right = subRL;if (subRL)subRL->_parent = parent;subR->_left = parent;parent->_parent = subR;if (Pparent == nullptr){_root = subR;subR->_parent = nullptr;}else{if (parent == Pparent->_left){Pparent->_left = subR;}else{Pparent->_right = subR;}subR->_parent = Pparent;}parent->_bf = subR->_bf = 0;}void RotateR(Node* parent)//右单旋{Node* subL = parent->_left;Node* subLR = subL->_right;Node* Pparent = parent->_parent;parent->_left = subLR;if (subLR)subLR->_parent = parent;subL->_right = parent;parent->_parent = subL;if (Pparent == nullptr){_root = subL;subL->_parent = nullptr;}else{if (parent == Pparent->_left){Pparent->_left = subL;}else{Pparent->_right = subL;}subL->_parent = Pparent;}parent->_bf = subL->_bf = 0;}void RotateRL(Node* parent)//右左双旋{Node* subR = parent->_right;Node* subRL = subR->_left;int bf = subRL->_bf;RotateR(subR);RotateL(parent);if (bf == 0)//当subRL为新增{subR->_bf = 0;parent->_bf = 0;subRL->_bf = 0;}else if (bf == 1)//当subRL右节点为新增{subR->_bf = 0;parent->_bf = -1;subRL->_bf = 0;}else if (bf == -1)//当subRL左节点为新增{subR->_bf = 1;parent->_bf = 0;subRL->_bf = 0;}elseassert(false);}void RotateLR(Node* parent)//左右双旋{Node* subL = parent->_left;Node* subLR = subL->_right;int bf = subLR->_bf;RotateR(subL);RotateL(parent);if (bf == 0)//当subLR为新增{subL->_bf = 0;parent->_bf = 0;subLR->_bf = 0;}else if (bf == -1)//当subLR左节点为新增{subL->_bf = 0;parent->_bf = 1;subLR->_bf = 0;}else if (bf == 1)//当subLR右节点为新增{subL->_bf = -1;parent->_bf = 0;subLR->_bf = 0;}elseassert(false);}bool insert(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 (kv.first < cur->_kv.first){parent = cur;cur = cur->_left;}elsereturn false;}cur = new Node(kv);if (parent->_kv.first < kv.first){parent->_right = cur;}else{parent->_left = cur;}cur->_parent = parent;while (parent) {if (cur == parent->_left){parent->_bf--;}else{parent->_bf++;}if (parent->_bf == 0)break;else if (parent->_bf == 1 || parent->_bf == -1)//继续向上更新{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)//异号需要双旋{RotateRL(parent);}else if (parent->_bf == -2 && cur->_bf == 1){RotateLR(parent);}elseassert(false);}}}Node* Find(const K& key){Node* cur = _root;while (cur){if (cur->_kv.first < key){cur = cur->_right;}else if (cur->_kv.first > key){cur = cur->_left;}else{return cur;}}return nullptr;}

2.4 AVL树的查找

Node* Find(const K& key){Node* cur = _root;while (cur){if (cur->_kv.first < key){cur = cur->_right;}else if (cur->_kv.first > key){cur = cur->_left;}else{return cur;}}return nullptr;}

测试代码

AVLTree<int, int> t;int a[] = { 4, 2, 6, 1, 3, 5, 15, 7, 16, 14 };for (auto e : a){t.insert({ e,e });}t.InOrder();


文章转载自:

http://Uh3K0tr7.gjcdr.cn
http://kxehDCvo.gjcdr.cn
http://PIwQipKa.gjcdr.cn
http://48IMAchR.gjcdr.cn
http://oobZzwj4.gjcdr.cn
http://YVYXNaCx.gjcdr.cn
http://5cf5HjiH.gjcdr.cn
http://KHFpAMtN.gjcdr.cn
http://nElLGIHz.gjcdr.cn
http://1TILlvgt.gjcdr.cn
http://lmUvZbEC.gjcdr.cn
http://rPc9HaV1.gjcdr.cn
http://bzYOuKJZ.gjcdr.cn
http://5wwfwzBK.gjcdr.cn
http://LSRYUHwg.gjcdr.cn
http://Wd3B0jwm.gjcdr.cn
http://2xJkeHpx.gjcdr.cn
http://dbKfVMgl.gjcdr.cn
http://lvJc0XRP.gjcdr.cn
http://Tqygb5np.gjcdr.cn
http://s5IT1caG.gjcdr.cn
http://IvxdqBCq.gjcdr.cn
http://cf1O4N60.gjcdr.cn
http://GlpvwJzq.gjcdr.cn
http://MfxoFMi5.gjcdr.cn
http://70Lsw7aS.gjcdr.cn
http://5pUrk1O3.gjcdr.cn
http://7cab5D4P.gjcdr.cn
http://ZEB8MwJG.gjcdr.cn
http://I9fiIGM2.gjcdr.cn
http://www.dtcms.com/wzjs/672216.html

相关文章:

  • 没备案的网站百度收录潮品服饰网站建设规划书
  • 昆明做个人网站小程序名称大全
  • 网站开发数据如何转化沧州海外网站建设
  • 慈溪做网站的公司宁波网站建设的企业
  • 网站做游戏吗seo外包优化公司
  • 福州公司建站模板招聘小程序怎么制作
  • 矿山建设工程公司网站东莞大岭山森林公园
  • 广元如何做百度的网站上海森琦阳网络科技有限公司
  • 做网站 技术wordpress网站背景
  • 微信怎么做捐钱的网站四合一网站建设源码
  • wordpress 图片整理快速排名优化公司
  • 网站备案是否收费游戏代理加盟
  • 上海高端网站搭建协会建设网站的必要性
  • 投稿的网站做网站很简单
  • 分类信息建站系统优秀设计网站推荐
  • 青岛百度网站排名推荐一下做图文的网站
  • 江门网站建设公司哪家好网站开发就业怎么样
  • 如何建立购物网站宁波网站优化找哪家
  • 网站开发专业有什么工作中国建设官网首页
  • 企业 北京 响应式网站巨量算数关键词查询
  • 怎样做百度推广网站鹤壁市城乡一体化示范区规划图
  • wordpress站点取名制作公司网站需要购买域名和服务器吗
  • 做抛物线的网站wordpress自定义404页面
  • 网站导航下拉菜单代码电商网站设计趋势
  • 怎样用网站模板做网站章丘市网站建设seo
  • 衡阳网站建设在中国可以做国外的域名网站吗
  • 什么样的企业要做网站做企业官网费用
  • 发果怎么做视频网站网站开发培训要多少钱
  • 网站用户 分析网站销售系统怎么做
  • 福建自己建设网站新闻发布会主持词