1. 平衡二叉树的基本介绍
    1. Java--算法--平衡二叉树(AVL树)_中序遍历
    2.  Java--算法--平衡二叉树(AVL树)_i++_02

  2. 平衡二叉排序树的左旋转与右旋转:

    1. Java--算法--平衡二叉树(AVL树)_i++_03

    2. Java--算法--平衡二叉树(AVL树)_i++_04

    3. Java--算法--平衡二叉树(AVL树)_中序遍历_05

    4. Java--算法--平衡二叉树(AVL树)_中序遍历_06

       

    5. package com.model.tree;
      
      /**
       * @Description:测试类
       * @Author: 张紫韩
       * @Crete 2021/7/16 20:07
       * 演示平衡二叉排序树的创建(AVL)
       */
      public class TreeDemo09 {
          public static void main(String[] args) {
              int[] array={4,3,6,5,7,8};
              AVCTree avcTree = new AVCTree();//平衡二叉搜索树
              for (int i = 0; i < array.length; i++) {
                  avcTree.add(new AVLNode(array[i]));
              }
              avcTree.infixOrder();
              avcTree.leftRotation();//左旋转
              avcTree.rightRotation();//右旋转
              System.out.println(avcTree.getHeight());
              System.out.println(avcTree.getLeftHeight());
              System.out.println(avcTree.getRightHeight());
      
              System.out.println("-------------------------");
              int[] array1={8,7,6,5,4,2,1};
              AVCTree avcTree1 = new AVCTree();
              for (int i = 0; i < array1.length; i++) {
                  avcTree1.add(new AVLNode(array1[i]));
              }
              while (Math.abs(avcTree1.getLeftHeight()-avcTree1.getRightHeight())>1) {
                  avcTree1.rightRotation();
                  avcTree1.leftRotation();
              }
      
              System.out.println(avcTree1.getHeight());
              System.out.println(avcTree1.getLeftHeight());
              System.out.println(avcTree1.getRightHeight());
      
      
      
          }
      }
      class AVCTree{
          private AVLNode root;
      
      //    右旋转
          public void rightRotation(){
              if (root==null){
                  return;
              }else {
                  if (getLeftHeight()-getRightHeight()>1){
                      root.rightRotation();
                  }
              }
          }
          //左旋转
          public void leftRotation(){
              if (root==null){
                  return;
              }else {
                  if (getRightHeight()-getLeftHeight()>1){
                      root.leftRotation();
                  }
              }
          }
      //    中序遍历节点
          public void infixOrder(){
              if (root==null){
                  System.out.println("树为空,无法进行遍历");
                  return;
              }else {
                  root.infixOrder();
              }
      
          }
      //    添加节点
          public void add(AVLNode node){
              if (root==null){
                  root=node;
              }else {
                  root.add(node);
              }
          }
      //    获得当前树的高度
          public int getHeight(){
              if (root==null){
                  return 0;
              }else {
                  return root.getHeight();
              }
          }
          public int getLeftHeight(){
              if (root==null){
                  return 0;
              }else {
                  if (root.getLeft()==null){
                      return 0;
                  }else {
                      return root.getLeft().getHeight();
                  }
              }
          }
          public int getRightHeight(){
              if (root==null){
                  return 0;
              }else {
                  if (root.getRight()==null){
                      return 0;
                  }else {
                      return root.getRight().getHeight();
                  }
              }
          }
          public AVCTree(AVLNode root) {
              this.root = root;
          }
      
          public AVCTree() {
          }
      
          public AVLNode getRoot() {
              return root;
          }
      
          public void setRoot(AVLNode root) {
              this.root = root;
          }
      }
      class AVLNode{
          private int value;
          private AVLNode left;
          private AVLNode right;
      //    右旋转
          public void rightRotation(){
              AVLNode newRoot = new AVLNode(this.value);
              newRoot.right=this.right;
              newRoot.left=this.left.right;
              this.value=this.left.value;
              this.left=this.left.left;
              this.right=newRoot;
      
          }
      //左旋转
          public void leftRotation(){
              AVLNode newRoot = new AVLNode(this.value);
              newRoot.left=this.left;
              newRoot.right=this.right.left;
              this.value=this.right.value;
              this.right=this.right.right;
              this.left=newRoot;
          }
      //    统计当前节点的高度
          public int getHeight(){
             return Math.max(this.left==null?1:this.left.getHeight()+1,this.right==null?1:this.right.getHeight()+1);
          }
          public void infixOrder(){
              if (this.left!=null){
                  this.left.infixOrder();
              }
              System.out.println(this.toString());
              if (this.right!=null){
                  this.right.infixOrder();
              }
          }
          public void add(AVLNode node){
              if (node==null){
               return;
              }else {
                  if (this.value>node.value){
                      if (this.left==null) {
                          this.left = node;
                      }else {
                          this.left.add(node);
                      }
                  }else{
                      if (this.right==null) {
                          this.right = node;
                      }else {
                          this.right.add(node);
                      }
                  }
              }
          }
          @Override
          public String toString() {
              return "AVLNode{" +
                      "value=" + value +
                      '}';
          }
      
          public int getValue() {
              return value;
          }
      
          public void setValue(int value) {
              this.value = value;
          }
      
          public AVLNode getLeft() {
              return left;
          }
      
          public void setLeft(AVLNode left) {
              this.left = left;
          }
      
          public AVLNode getRight() {
              return right;
          }
      
          public void setRight(AVLNode right) {
              this.right = right;
          }
      
          public AVLNode(int value) {
              this.value = value;
          }
      }
  3.  平衡二叉排序树的双旋转:

    1. Java--算法--平衡二叉树(AVL树)_二叉排序树_07

    2. Java--算法--平衡二叉树(AVL树)_中序遍历_08

    3.  Java--算法--平衡二叉树(AVL树)_i++_09

       

       

    4. package com.model.tree;
      
      /**
       * @Description:测试类
       * @Author: 张紫韩
       * @Crete 2021/7/16 20:07
       * 演示平衡二叉排序树的创建(AVL)
       */
      public class TreeDemo09 {
          public static void main(String[] args) {
              int[] array={4,3,6,5,7,8};
              AVCTree avcTree = new AVCTree();//平衡二叉搜索树
              for (int i = 0; i < array.length; i++) {
                  avcTree.add(new AVLNode(array[i]));
              }
              avcTree.infixOrder();
              avcTree.leftRotation();//左旋转
              avcTree.rightRotation();//右旋转
              System.out.println(avcTree.getHeight());
              System.out.println(avcTree.getLeftHeight());
              System.out.println(avcTree.getRightHeight());
      
              System.out.println("-------------------------");
              int[] array1={8,7,6,5,4,2,1};
              AVCTree avcTree1 = new AVCTree();
              for (int i = 0; i < array1.length; i++) {
                  avcTree1.add(new AVLNode(array1[i]));
              }
              while (Math.abs(avcTree1.getLeftHeight()-avcTree1.getRightHeight())>1) {
                  avcTree1.rightRotation();
                  avcTree1.leftRotation();
              }
              System.out.println(avcTree1.getHeight());
              System.out.println(avcTree1.getLeftHeight());
              System.out.println(avcTree1.getRightHeight());
              System.out.println("----------------------");
              AVCTree tree = new AVCTree();
              tree.add(new AVLNode(10));
              tree.add(new AVLNode(11));
              tree.add(new AVLNode(7));
              tree.add(new AVLNode(6));
              tree.add(new AVLNode(8));
              tree.add(new AVLNode(9));
              tree.rightRotation();
              System.out.println(tree.getLeftHeight());
              System.out.println(tree.getRightHeight());
              System.out.println(tree.getHeight());
              System.out.println(tree.getRoot());
              tree.infixOrder();
      
      
          }
      }
      class AVCTree{
          private AVLNode root;
      
      //    右旋转
          public void rightRotation(){
              if (root==null){
                  return;
              }else {
                  if (getLeftHeight()-getRightHeight()>1){
      //                检查是否需要进行双旋转
                      if (root.getLeft()!=null){
                          if (root.getLeft().getRight()!=null&&root.getLeft().getLeft()!=null){
                              if (root.getLeft().getRight().getHeight()>root.getLeft().getLeft().getHeight()){
                                  root.getLeft().leftRotation();
                              }
                          }
                      }
                      root.rightRotation();
                  }
              }
          }
          //左旋转
          public void leftRotation(){
              if (root==null){
                  return;
              }else {
                  if (getRightHeight()-getLeftHeight()>1){
                      //                检查是否需要进行双旋转
                      if (root.getRight()!=null){
                          if (root.getRight().getLeft()!=null&&root.getRight().getRight()!=null){
                              if (root.getRight().getLeft().getHeight()>root.getRight().getRight().getHeight()){
                                  root.getRight().rightRotation();
                              }
                          }
                      }
                      root.leftRotation();
                  }
              }
          }
      //    中序遍历节点
          public void infixOrder(){
              if (root==null){
                  System.out.println("树为空,无法进行遍历");
                  return;
              }else {
                  root.infixOrder();
              }
      
          }
      //    添加节点
          public void add(AVLNode node){
              if (root==null){
                  root=node;
              }else {
                  root.add(node);
              }
          }
      //    获得当前树的高度
          public int getHeight(){
              if (root==null){
                  return 0;
              }else {
                  return root.getHeight();
              }
          }
          public int getLeftHeight(){
              if (root==null){
                  return 0;
              }else {
                  if (root.getLeft()==null){
                      return 0;
                  }else {
                      return root.getLeft().getHeight();
                  }
              }
          }
          public int getRightHeight(){
              if (root==null){
                  return 0;
              }else {
                  if (root.getRight()==null){
                      return 0;
                  }else {
                      return root.getRight().getHeight();
                  }
              }
          }
          public AVCTree(AVLNode root) {
              this.root = root;
          }
      
          public AVCTree() {
          }
      
          public AVLNode getRoot() {
              return root;
          }
      
          public void setRoot(AVLNode root) {
              this.root = root;
          }
      }
      class AVLNode{
          private int value;
          private AVLNode left;
          private AVLNode right;
      //    右旋转
          public void rightRotation(){
              AVLNode newRoot = new AVLNode(this.value);
              newRoot.right=this.right;
              newRoot.left=this.left.right;
              this.value=this.left.value;
              this.left=this.left.left;
              this.right=newRoot;
      
          }
      //左旋转
          public void leftRotation(){
              AVLNode newRoot = new AVLNode(this.value);
              newRoot.left=this.left;
              newRoot.right=this.right.left;
              this.value=this.right.value;
              this.right=this.right.right;
              this.left=newRoot;
          }
      //    统计当前节点的高度
          public int getHeight(){
             return Math.max(this.left==null?1:this.left.getHeight()+1,this.right==null?1:this.right.getHeight()+1);
          }
          public void infixOrder(){
              if (this.left!=null){
                  this.left.infixOrder();
              }
              System.out.println(this.toString());
              if (this.right!=null){
                  this.right.infixOrder();
              }
          }
          public void add(AVLNode node){
              if (node==null){
               return;
              }else {
                  if (this.value>node.value){
                      if (this.left==null) {
                          this.left = node;
                      }else {
                          this.left.add(node);
                      }
                  }else{
                      if (this.right==null) {
                          this.right = node;
                      }else {
                          this.right.add(node);
                      }
                  }
              }
          }
          @Override
          public String toString() {
              return "AVLNode{" +
                      "value=" + value +
                      '}';
          }
      
          public int getValue() {
              return value;
          }
      
          public void setValue(int value) {
              this.value = value;
          }
      
          public AVLNode getLeft() {
              return left;
          }
      
          public void setLeft(AVLNode left) {
              this.left = left;
          }
      
          public AVLNode getRight() {
              return right;
          }
      
          public void setRight(AVLNode right) {
              this.right = right;
          }
      
          public AVLNode(int value) {
              this.value = value;
          }
      }