您的位置:首页 > 其它

AVL平衡树

2012-07-13 11:34 211 查看
package net.liuyx.algorithm;

import java.util.Comparator;

public class AVL<T> {

private static class AvlNode<E> {
@SuppressWarnings("unused")
public AvlNode(E theElement) {
this(theElement, null, null);
}

AvlNode(E theElement, AvlNode<E> lt, AvlNode<E> rt) {
element = theElement;
left = lt;
right = rt;
height = 0;
}

E element; // The data in the node
AvlNode<E> left;
AvlNode<E> right;
int height;
}

private Comparator<? super T> cmp;

public AVL(Comparator<? super T> c) {
cmp = c;
}

private int height(AvlNode<T> t) {
return t == null ? -1 : t.height;
}

private AvlNode<T> insert(T x, AvlNode<T> t) {
if (t == null)
return new AvlNode<T>(x, null, null);

int compareResult = compare(x, t.element);

if (compareResult < 0) {
t.left = insert(x, t.left);
if (height(t.left) - height(t.right) == 2) {
if (compare(x, t.left.element) < 0)
t = rotateWithLeftChild(t);
else
t = doubleWithLeftChild(t);
}
} else if (compareResult > 0) {
t.right = insert(x, t.right);
if (height(t.right) - height(t.left) == 2)
if (compare(x, t.right.element) > 0)
t = rotateWithRightChild(t);
else
t = doubleWithRightChild(t);
} else
; // Duplicate; do nothing
t.height = Math.max(height(t.left), height(t.right)) + 1;
return t;
}

private AvlNode<T> rotateWithLeftChild(AvlNode<T> k2) {
AvlNode<T> 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), k2.height) + 1;
return k1;
}

private AvlNode<T> rotateWithRightChild(AvlNode<T> k2) {
AvlNode<T> 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), k2.height) + 1;
return k2;
}

private AvlNode<T> doubleWithLeftChild(AvlNode<T> k3) {
k3.left = rotateWithRightChild(k3.left);
return rotateWithLeftChild(k3);
}

private AvlNode<T> doubleWithRightChild(AvlNode<T> k3) {
k3.right = rotateWithRightChild(k3.right);
return rotateWithLeftChild(k3);
}

@SuppressWarnings("unchecked")
private int compare(T x, T y) {
if (cmp != null)
return cmp.compare(x, y);
return ((Comparable<T>) x).compareTo(y);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  null insert class c