1 前言
最近在研读《数据结构与算法经典问题解析》和《数据结构与算法分析 c语言描述》两本书,记录一下学习AVL树的笔记。
2 平衡二叉树——AVL树的旋转操作
2.1 AVL树的特点
AVL树本质上还是一棵二叉搜索树,它的特点是:
1.本身首先是一棵二叉搜索树。
2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。
也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。
2.2 AVL树的定义
package Binary_Tree_Study;
/**
* Created by Administrator on 2018/5/20.
*/
public class AVLTreeNode {
private int data;//结点的数据
private int height;//树的高度
private AVLTreeNode left;//指向左孩子结点
private AVLTreeNode right;//指向左孩子结点
public AVLTreeNode(int data) {
this.data = data;
this.height = 0;
this.left = null;
this.right =null;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public AVLTreeNode getLeft() {
return left;
}
public void setLeft(AVLTreeNode left) {
this.left = left;
}
public AVLTreeNode getRight() {
return right;
}
public void setRight(AVLTreeNode right) {
this.right = right;
}
}
2.3 AVL树的旋转操作
2.3.1 LL旋转
//LL旋转
public AVLTreeNode singleRotateLeft(AVLTreeNode x){
AVLTreeNode w= x.getLeft();
x.setLeft(w.getRight());
w.setRight(x);
x.setHeight(Math.max(Height(x.getLeft()),Height(x.getRight()))+1);
w.setHeight(Math.max(Height(w.getLeft()),x.getHeight())+1);
return w;
}
//求树的高度
public int Height(AVLTreeNode root) {
if (root == null)
return -1;
else
return root.getHeight();
}
2.3.2 RR旋转
//RR旋转
public AVLTreeNode singleRotateRight(AVLTreeNode w){
AVLTreeNode x= w.getRight();
w.setRight(x.getLeft());
x.setLeft(w);
w.setHeight(Math.max(Height(w.getRight()),Height(w.getLeft()))+1);
x.setHeight(Math.max(Height(x.getRight()),w.getHeight())+1);
return x;
}
2.3.3 LR旋转
//LR旋转
public AVLTreeNode doubleRotateLeft(AVLTreeNode z){
z.setLeft(singleRotateRight(z.getLeft()));//在X和Y之间旋转
return singleRotateLeft(z);//在Z和Y之间旋转
}
2.3.4 RL旋转
//RL旋转
public AVLTreeNode doubleRotateRight(AVLTreeNode x){
x.setRight(singleRotateRight(x.getLeft()));//在Z和Y之间旋转
return singleRotateRight(x);//在X和Y之间旋转
}
3 AVL 树的插入操作
//插入操作
public AVLTreeNode insert(AVLTreeNode root, int data) {
if (root == null)
root = new AVLTreeNode(data);//若原树为空, 生成并返回一个结点的AVL树
else if (data < root.getData()) {
root.setLeft(insert(root.getLeft(),data));
if (Height(root.getLeft())-Height(root.getRight()) == 2)
if (data < root.getLeft().getData())
root = singleRotateLeft(root);
else
root = doubleRotateLeft(root);
} else if (data > root.getData()) {
root.setRight(insert(root.getRight(),data));
if (Height(root.getRight())-Height(root.getLeft()) == 2)
if (data < root.getRight().getData())
root = singleRotateRight(root);
else
root = doubleRotateRight(root);
}
/*否则,数据已经存在,程序什么也不做。*/
root.setHeight(Math.max(Height(root.getLeft()),Height(root.getRight()))+1);
return root;
}
4 参考资料
[1] 数据结构与算法经典问题解析
[2] 数据结构与算法分析 c语言描述
[3] AVL树-----百度百科
后记:
后续看了一些博文,感觉写得挺不错的,在此备注一下,以便以后查阅。
6. AVL树之java实现
7. 图解数据结构树之AVL树
8. 数据结构之AVL树
10. java数据结构与算法之平衡二叉树(AVL树)的设计与实现
11. 彻底搞懂AVL树