AVL 树的意义:是二分查找树 BST 。二分查找树查找某个值时,时间复杂度是 O(h) ,因此,我们让树的尽可能平衡,即最大高度尽可能的小。因此有了 AVL 。
创新互联长期为上千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为北关企业提供专业的网站建设、网站制作,北关网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。
参考例题:
百度百科[2]:在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,他们在1962年的论文《An algorithm for the organization of information》中发表了它。
BST 本质上是维护一个有序序列,AVL 树中的左旋右旋操作,并不会改变树的中序遍历结果。
上图中把 A 右旋是怎么做的呢?把 B 旋转到根节点,然后把 A 变成 B 的右孩子,把 E 补偿给 A 作为 A 的左孩子。
对节点 u 右旋:
- void R(int& u)
- {
- int p = l[u];
- l[u] = r[p], r[p] = u;
- update(u), update(p);
- u = p;
- }
对节点 u 右旋:
- void L(int& u)
- {
- int p = r[u];
- r[u] = l[p], l[p] = u;
- update(u), update(p);
- u = p;
- }
高度更新由左右儿子决定,因为求高度时,默认其两个儿子已经更新完高度了:
- void update(int u)
- {
- h[u] = max(h[l[u]], h[r[u]]) + 1;
- }
四种情况
(一)新数字插到了左子树,导致左子树比右子树高2;左孩子的左子树比其右子树高1
对于四种情况中的①。应该右旋 A 。
实例如上图,右旋 88 即可。
(二)新数字插到了左子树,导致左子树比右子树高2;左孩子的右子树比其左子树高1
对于四种情况中的③。应该左旋 B 再右旋 A 。
对应的情况如如下:
- 70
- 61
- 65
- // 左旋 61
- 70
- 65
- 61
- // 右旋 70
- 65
- 61 70
(三)新数字插到了右子树,导致右子树比左子树高2;右孩子的右子树比其左子树高1
对于四种情况中的②。应该左旋 A 。
对应的情况如 88 96 120 ,左旋 88 即可。
(四)新数字插到了右子树,导致右子树比左子树高2;右孩子的左子树比其右子树高1
对于四种情况中的④。应该右旋 B 再左旋 A 。
对应的情况如如下:
- 70
- 96
- 88
- // 右旋 96
- 70
- 88
- 96
- // 左旋 70
- 96
- 70 88
- void insert(int& u, int w)
- {
- if (!u) u = ++ idx, v[u] = w;
- else if (w < v[u])
- {
- insert(l[u], w);
- if (get_balance(u) == 2)
- {
- if (get_balance(l[u]) == 1) R(u);
- else L(l[u]), R(u);
- }
- }
- else
- {
- insert(r[u], w);
- if (get_balance(u) == -2)
- {
- if (get_balance(r[u]) == -1) L(u);
- else R(r[u]), L(u);
- }
- }
- update(u);
- }
参考资料
[1]AVL树的根: https://www.acwing.com/problem/content/description/1554/
[2]百度百科: https://baike.baidu.com/item/AVL%E6%A0%91/10986648
新闻标题:AVL小树转转转转转,我的考试挂挂挂挂挂
分享地址:http://www.mswzjz.cn/qtweb/news17/59367.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能