平衡二叉树——AVL树的旋转操作:Java语言实现

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旋转

《平衡二叉树——AVL树的旋转操作:Java语言实现》

 //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旋转

《平衡二叉树——AVL树的旋转操作:Java语言实现》

//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旋转

《平衡二叉树——AVL树的旋转操作:Java语言实现》

//LR旋转 public AVLTreeNode doubleRotateLeft(AVLTreeNode z){ z.setLeft(singleRotateRight(z.getLeft()));//在X和Y之间旋转 return singleRotateLeft(z);//在Z和Y之间旋转 }

2.3.4 RL旋转

《平衡二叉树——AVL树的旋转操作:Java语言实现》

//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树—–百度百科

后记:

       后续看了一些博文,感觉写得挺不错的,在此备注一下,以便以后查阅。

1. JAVA实践自平衡二叉树(AVL树)

2. java实现平衡二叉树(详细分析)

3. AVL树(三)之 Java的实现

4. AVL树Java实现,包括删除

5. 数据结构图文解析之:AVL树详解及C++模板实现

6. AVL树之java实现

7. 图解数据结构树之AVL树

8. 数据结构之AVL树

9. AVL平衡树(详解)-JAVA/C版本

10. java数据结构与算法之平衡二叉树(AVL树)的设计与实现

11. 彻底搞懂AVL树

12. 平衡二叉树(Balance Binary Tree) –AVL树

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/cqulun123/article/details/80399371
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞