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树