package ch04;
import java.util.TreeMap;
import java.util.TreeSet;
/**
* Created by cookfront on 2017/3/5.
*/
public class AvlTree<AnyType extends Comparable<? super AnyType>> {
private static final int ALLOWED_IMBALANCE = 1;
private static class AvlNode<AnyType> {
AvlNode(AnyType theElement) {
this(theElement, null, null);
}
AvlNode(AnyType theElement, AvlNode<AnyType> lt, AvlNode<AnyType> rt) {
element = theElement;
left = lt;
right = rt;
height = 0;
}
AnyType element;
AvlNode<AnyType> left;
AvlNode<AnyType> right;
int height;
}
private int height(AvlNode<AnyType> t) {
return t == null ? -1 : t.height;
}
private AvlNode<AnyType> root;
public AvlTree() {
root = null;
}
public void makeEmpty() {
root = null;
}
public boolean isEmpty() {
return root == null;
}
public boolean contains(AnyType x) {
return contains(x, root);
}
public AnyType findMax() {
if (isEmpty()) {
}
return findMax(root).element;
}
public AnyType findMin() {
if (isEmpty()) {
}
return findMin(root).element;
}
public void insert(AnyType x) {
root = insert(x, root);
}
public void remove(AnyType x) {
root = remove(x, root);
}
public void printTree() {
if( isEmpty( ) )
System.out.println( "Empty tree" );
else
printTree(root);
}
private void printTree(AvlNode<AnyType> t) {
if (t != null) {
printTree(t.left);
System.out.println(t.element);
printTree(t.right);
}
}
private boolean contains(AnyType x, AvlNode<AnyType> t) {
// 必须对空树测试
if (t == null) return false;
int compareResult = x.compareTo(t.element);
if (compareResult < 0) {
return contains(x, t.left);
} else if (compareResult > 0) {
return contains(x, t.right);
}
return true;
}
private AvlNode<AnyType> findMin(AvlNode<AnyType> t) {
if (t != null) {
while (t.left != null) {
t = t.left;
}
}
return t;
}
private AvlNode<AnyType> findMax(AvlNode<AnyType> t) {
if (t != null) {
while (t.right != null) {
t = t.right;
}
}
return t;
}
private AvlNode<AnyType> insert(AnyType x, AvlNode<AnyType> t) {
if (t == null) {
t = new AvlNode<AnyType>(x, null, null);
}
int compareResult = x.compareTo(t.element);
if (compareResult < 0) {
t.left = insert(x, t.left);
} else if (compareResult > 0) {
t.right = insert(x, t.right);
}
return balance(t);
}
/**
* 重新平衡Avl树
*
* @param t
* @return
*/
private AvlNode<AnyType> balance(AvlNode<AnyType> t) {
if (t == null) {
return t;
}
if (height(t.left) - height(t.right) > ALLOWED_IMBALANCE) {
// 单旋转
if (height(t.left.left) > height(t.left.right)) {
t = rotateWithLeftChild(t);
} else { // 双旋转
t = doubleWithLeftChild(t);
}
} else if (height(t.right) - height(t.left) > ALLOWED_IMBALANCE) {
if (height(t.right.right) > height(t.right.left)) {
t = rotateWithRightChild(t);
} else {
t = doubleWithRightChild(t);
}
}
t.height = Math.max(height(t.left), height(t.right)) + 1;
return t;
}
private AvlNode<AnyType> rotateWithLeftChild(AvlNode<AnyType> k2) {
AvlNode<AnyType> k1 = k2.left;
k2.left = k1.right;
k1.right = k2;
k2.height = Math.max(height(k2.left), height(k2.right)) + 1;
k1.height = Math.max(height(k1.left), height(k1.right)) + 1;
return k1;
}
private AvlNode<AnyType> rotateWithRightChild(AvlNode<AnyType> k2) {
AvlNode<AnyType> k1 = k2.right;
k2.right = k1.left;
k1.left = k2;
k2.height = Math.max(height(k2.left), height(k2.right)) + 1;
k1.height = Math.max(height(k1.left), height(k1.right)) + 1;
return k1;
}
private AvlNode<AnyType> doubleWithLeftChild(AvlNode<AnyType> k3) {
k3.left = rotateWithRightChild(k3.left);
return rotateWithLeftChild(k3);
}
private AvlNode<AnyType> doubleWithRightChild(AvlNode<AnyType> k3) {
k3.right = rotateWithLeftChild(k3.right);
return rotateWithRightChild(k3);
}
private AvlNode<AnyType> remove(AnyType x, AvlNode<AnyType> t) {
if (t == null) {
return t;
}
int compareResult = x.compareTo(t.element);
if (compareResult < 0) {
t.left = remove(x, t.left);
} else if (compareResult > 0) {
t.right = remove(x, t.right);
} else if (t.left != null && t.right != null) {
t.element = findMin(t.right).element;
t.right = remove(t.element, t.right);
} else {
t = t.left != null ? t.left : t.right;
}
return balance(t);
}
}
AVL平衡树代码
最新推荐文章于 2024-09-14 22:11:27 发布