java项目---用java实现二叉平衡树(AVL树)并打印结果(详)

Posted KlayHu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java项目---用java实现二叉平衡树(AVL树)并打印结果(详)相关的知识,希望对你有一定的参考价值。

  1 package Demo;
  2 
  3 public class AVLtree  {
  4     private Node root;                      //首先定义根节点
  5 
  6     private static class Node{                              //定义Node指针参数
  7         private int key;                //节点
  8         private int balance;                    //平衡值
  9         private int height;             //树的高度
 10         private Node left;                      //左节点
 11         private Node right;             //右节点
 12         private Node parent;                    //父母节点
 13 
 14 
 15     Node(int key, Node parent){             //构造器中引用该构造器正在初始化的对象
 16         this.key = key;
 17         this.parent = parent;
 18 
 19         }
 20     }
 21     public boolean insert(int key){             //判断这里是否能插入新的节点
 22         if(root == null){
 23             root = new Node(key,null);
 24             return true;
 25         }
 26 
 27         Node n = root;
 28         while (true){                           //如果根节点下的子节点和新插进来的子节点相同
 29             if(n.key == key)
 30                 return false;                   //则不进行插入操作
 31 
 32             Node parent = n;
 33 
 34             boolean goLeft = n.key > key;           //判断新的节点插入父母节点的左边or右边
 35             n = goLeft ? n.left : n.right;             //小的话插左边,大的话插右边
 36 
 37             if(n == null){
 38                 if(goLeft){
 39                     parent.left = new Node (key,parent);
 40                 }else{
 41                     parent.right = new Node(key,parent);
 42                 }
 43                 rebalance(parent);
 44                 break;
 45             }
 46         }
 47         return true;
 48     }
 49 
 50     private void delete(Node node){                     //删除节点
 51         if(node.left == null && node.right == null){
 52             if(node.parent == null){
 53                 root = null;
 54             }else{
 55                 Node parent = node.parent;
 56                 if(parent.left == node){            //如果父母节点的左孩子节点和根节点一样
 57                     parent.left = null;             //则左节点为空
 58                 }else{
 59                     parent.right = null;            //反之右节点为空
 60                 }
 61                 rebalance(parent);
 62             }
 63             return ;
 64         }
 65 
 66         if(node.left != null){              //如果左节点不空
 67             Node child = node.left;
 68             while(child.right != null)child = child.right;
 69             node.key = child.key;
 70             delete(child);
 71         }else{
 72             Node child = node.right;
 73             while (child.left != null)child = child.left;
 74             node.key = child.key;
 75             delete(child);
 76             }
 77         }
 78 
 79         public void Delete(int delKey){
 80         if(root == null)
 81             return;
 82 
 83         Node child = root;
 84         while (child != null){
 85             Node node = child;                           //交换根节点给node , 再判断新的孩子节点插在哪里
 86             child = delKey >= node.key ? node.right : node.left;
 87             if(delKey == node.key){
 88                 delete(node);
 89                 return;
 90             }
 91         }
 92     }
 93 
 94     private void setBalance(Node... nodes){
 95         for(Node n : nodes){
 96             reheight(n);
 97             n.balance = height(n.right) - height(n.left);           //平衡因子,任意节点左右子树高度差
 98         }
 99     }
100 
101     private void rebalance (Node n){
102         setBalance(n);
103 
104         if(n.balance == -2){
105             if(height(n.left.left) >= height(n.left.right))
106                 n = rotateRight(n);
107             else
108                 n = rotateLeftThenRight(n) ;
109 
110         }else if(n.balance == 2){                                   //等于2和-2都是不平衡的,需要重新调整
111             if(height(n.right.right) >= height(n.right.left))
112                 n = rotateLeft(n);
113             else
114                 n = rotateRightThenLeft(n);
115 
116         }
117 
118         if(n.parent != null){
119             rebalance(n.parent);
120         }else{
121             root = n;
122         }
123     }
124 
125     private Node rotateLeft(Node a){
126 
127         Node b = a.right;
128         b.parent = a.parent;
129 
130         a.right = b.left;
131 
132         if(a.right != null)
133             a.right.parent = a;
134 
135         b.left = a;
136         a.parent = b;
137 
138         if(b.parent != null){
139             if(b.parent.right == a){
140                 b.parent.right = b;
141             }else{
142                 b.parent.left = b;
143             }
144         }
145 
146         setBalance(a, b);
147 
148         return b;
149     }
150 
151     private Node rotateRight(Node a){
152 
153         Node b = a.left;
154         b.parent = a.parent;
155 
156         a.left = b.right;
157 
158         if(a.left != null){
159             a.left.parent = a;
160 
161             b.right = a;
162             a.parent = b;
163 
164             if(b.parent.right == a){
165                 b.parent.right = b;
166             }else{
167                 b.parent.left = b;
168             }
169         }
170 
171         setBalance(a, b);
172 
173         return b;
174     }
175 
176     private Node rotateLeftThenRight(Node n){
177         n.left = rotateLeft(n.left);
178         return rotateRight(n);
179     }
180 
181     private Node rotateRightThenLeft(Node n){
182         n.right = rotateRight(n.right);
183         return rotateLeft(n);
184     }
185 
186     private int height (Node n){
187         if(n == null)
188             return -1;
189         return n.height;
190     }
191 
192 
193 
194     public void printBalance(){
195         printBalance(root);
196     }
197 
198     private void printBalance(Node n){
199         if(n != null){
200             printBalance(n.left);
201             System.out.printf("%s ",n.balance);
202             printBalance(n.right);
203         }
204     }
205 
206     private void reheight(Node node){
207         if(node != null){
208             node.height = 1 + Math.max(height(node.left),height(node.right));           //新的二叉平衡树高度为:
209         }
210     }
211     public static void main(String[] args) {
212         AVLtree tree = new AVLtree();
213 
214         System.out.println("Inserting values 1 to 10");     //最后输出的结果代表平衡因子,0为左右子树高度相等,1为左右子树高度相差1层
215         for (int i = 1; i < 10; i++)
216             tree.insert(i);
217 
218         System.out.println("Print balance : ");
219         tree.printBalance();
220     }
221 }


    可以动手画一下生成的AVL树,亲测算法符合结果。

 


 

以上是关于java项目---用java实现二叉平衡树(AVL树)并打印结果(详)的主要内容,如果未能解决你的问题,请参考以下文章

自己动手实现java数据结构 AVL树

平衡二叉树 AVL树结构详解 [Java实现]

Java数据结构与算法解析——AVL树

D13-平衡二叉树[Java数据结构和算法]

Java树结构实际应用(平衡二叉树/AVL树)

AVL树(Java语言)