1.什么是平衡二叉树
平衡树(Balance Tree,BT) 指的是,任意节点的子树的高度差都小于等于1他是二叉排序树的改进,解决了二叉排序树的一些小问题平衡二叉树一定是二叉排序树
右子树的高度比左子树的高度要高的时候进行左旋转
左旋转的目的是为了降低右子树的高度
左子树的高度比右子树的高度要高的时候进行右旋转
右旋转的目的是为了降低左子树的高度
这个明显通过单个方向的旋转解决不了问题,需要使用双旋转
什么情况下需要使用双旋转:他的左子树的右子树高度大于他的左子树高度解决方案:先对当前节点的左节点进行左旋转在对当前节点进行右旋转操作
2.代码实现
package com
.qin
.avl
;
public class AVLTreeDemo {
public static void main(String
[] args
) {
int[] arr
= {10,11,7,6,8,9};
AVLTree avlTree
= new AVLTree();
for (int i
= 0; i
< arr
.length
; i
++) {
avlTree
.add(new Node(arr
[i
]));
}
System
.out
.println("中序遍历");
avlTree
.infixOrder();
System
.out
.println("==================");
System
.out
.println("在旋转之后");
System
.out
.println("树的高度"+avlTree
.getRoot().height());
System
.out
.println("树的左子树高度"+avlTree
.getRoot().leftHeight());
System
.out
.println("树的右子树高度"+avlTree
.getRoot().rightHeight());
}
}
class AVLTree{
private Node root
;
public Node
getRoot() {
return root
;
}
public void add(Node node
){
if (root
==null
){
root
= node
;
}else {
root
.add(node
);
}
}
public void infixOrder(){
if (root
!=null
){
root
.infixOrder();
}else {
System
.out
.println("当前二叉排序树是空的,无法遍历");
}
}
}
class Node{
int value
;
Node left
;
Node right
;
public Node(int value
) {
this.value
= value
;
}
@Override
public String
toString() {
return "Node{" +
"value=" + value
+
'}';
}
public void add(Node node
){
if (node
== null
){
return;
}
if (node
.value
<this.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
);
}
}
if (rightHeight()-leftHeight()>1){
if (right
!=null
&& right
.left
.height()>right
.height()){
right
.rightRotate();
leftRotate();
}else {
leftRotate();
}
return;
}
if (leftHeight()-rightHeight()>1){
if (left
!=null
&& left
.right
.height()>left
.leftHeight()){
left
.leftRotate();
rightRotate();
}else {
rightRotate();
}
}
}
public void infixOrder(){
if (this.left
!=null
){
this.left
.infixOrder();
}
System
.out
.println(this);
if (this.right
!=null
){
this.right
.infixOrder();
}
}
public int height(){
return Math
.max(left
==null
?0:left
.height(),right
==null
?0:right
.height())+1;
}
public int leftHeight(){
if (left
==null
){
return 0;
}
return left
.height();
}
public int rightHeight(){
if (right
==null
){
return 0;
}
return right
.height();
}
private void leftRotate(){
Node newNode
= new Node(value
);
newNode
.left
= left
;
newNode
.right
= right
.left
;
value
= right
.value
;
right
= right
.right
;
left
= newNode
;
}
private void rightRotate(){
Node newNode
= new Node(value
);
newNode
.right
= right
;
newNode
.left
= left
.right
;
value
= left
.value
;
left
= left
.left
;
right
= newNode
;
}
}