avl树的旋转
avl树:AVL树本质上是一颗二叉查找树
1.avl树的性质
左子树和右子树的高度之差的绝对值不超过1
树中的每个左子树和右子树都是AVL树
每个节点都有一个平衡因子(balance factor--bf),任一节点的平衡因子是-1,0,1之一
2.avl树的操作
AVL树的操作基本和二叉查找树一样,这里我们关注的是两个变化很大的操作:插入和删除!
AVL树不仅是一颗二叉查找树,它还有其他的性质。如果我们按照一般的二叉查找树的插入方式可能会破坏AVL树的平衡性。同理,在删除的时候也有可能会破坏树的平衡性,所以我们要做一些特殊的处理,包括:单旋转和双旋转!
/**
* 返回较大的值
* @param l
* @param r
* @return
*/
public int max(int l, int r){
return (l > r ? l : r);
}
/**
* 获取树高度
* @param n
* @return
*/
public int hight(Node<Integer> n) {
if(n==null)
return -1;
else
return n.high;
}
3.单旋转:
单旋的第一种情况:右旋
/**
* 整个树是右旋的单旋转
* @param head
* @return
*/
public Node<Integer> singleRotateRight(Node<Integer> head){
Node<Integer> tmp = head.left;
head.left = tmp.right;
tmp.right = head; //旋转后深度随之变化,需要修改深度
head.high = max(hight(head.left), hight(head.right)) + 1;
tmp.high = max(hight(tmp.left), hight(tmp.right)) + 1;
return tmp;//返回新的子树根节点
}
单旋的第二种情况:左旋
/**
* 整个树是左旋的单旋转
* @param head
* @return
*/
public Node<Integer> singleRotateLeft(Node<Integer> head){
Node<Integer> tmp = head.right;
head.right = tmp.left;
tmp.left = head;
head.high = max(hight(head.left), hight(head.right)) + 1;
tmp.high = max(hight(tmp.left), hight(tmp.right)) + 1;
return tmp;
}
4.双旋转:
双旋的第一种情况:左右(先左后右)旋
/**
* 整个树是右旋的双旋转
* @param head
* @return
*/
public Node<Integer> doubleRotateRight(Node<Integer> head){
head.left = singleRotateLeft(head.left);
return singleRotateRight(head);//再将整个树左旋
}
双旋的第二种情况:右左(先右后左)旋
/**
* 整个树是左旋的双旋转
* @param head
* @return
*/
public Node<Integer> doubleRotateLeft(Node<Integer> head){
head.right = singleRotateRight(head.right);
return singleRotateLeft(head);//再将整个树右旋
}
评论区
请写下您的评论...
猜你喜欢
blog
二叉树的左旋和右旋
数据结构与算法
5164
在关于树的多种算法中都用到了树的旋转来使树保持相对平衡,比如avl树,红黑树等...1.树的左旋(pivot为旋转中心点)2.来个动图3.代码演示:/** *左旋 *p为旋转的中心点
blog
avl树的插入和删除操作
数据结构与算法
3219
packageavlTree;importjava.util.LinkedList;/***avl树(平衡二叉树)*@authorAdministrator**/publicclassAvlTree
ofc
旋转图像
official
970
像顺时针旋转90度。你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例1输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]
输出:[[7
ofc
手撕红黑树(1)-预备知识
weblog
3898
本篇文章为红黑树的预备知识,暂且不涉及节点颜色。
二叉树左旋
左旋的过程是将x的右子树绕x逆时针旋转,使得x的右子树成为x的父节点,同时修改相关节点的引用。旋转之后,二叉查找树的属性仍然满足
blog
二叉树的一些性质
数据结构与算法
3880
转载:https://www.cnblogs.com/willwu/p/6007555.html1.树的定义树是一种数据结构,它是由n(n=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是
weblog
5306
红黑树简介
红黑树(RedBlackTree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。红黑树和AVL树类似,都是在进行插入和删除操作时通过特定
数据结构与算法
7666
题目:判断下方两棵二叉树右方的二叉树是否为左方二叉树的子树例1:||/-----------10(10)------\/-------10(10)------\||||/-------5(5
ofc
二叉树中的列表
official
1364
叉树和一个head为第一个节点的链表。如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以head为首的链表中每个节点的值,那么请你返回True,否则返回False。一直向下的路径的意思
最新发表
归档
2018-11
12
2018-12
33
2019-01
28
2019-02
28
2019-03
32
2019-04
27
2019-05
33
2019-06
6
2019-07
12
2019-08
12
2019-09
21
2019-10
8
2019-11
15
2019-12
25
2020-01
9
2020-02
5
2020-03
16
2020-04
4
2020-06
1
2020-07
7
2020-08
13
2020-09
9
2020-10
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
2024-08
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。