一、 AVL代码的实现
public class Node {
private Node left;
private Node right;
private Node parent;
private int value;
private int height;
public Node(int value) {
super();
this.value = value;
this.height = 0;
}
public Node getParent() {
return parent;
}
public void setParent(Node parent) {
this.parent = parent;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public static int getHeight(Node node) {
return node == null ? 0 : node.getHeight();
}
public static int maxHeight(Node left, Node right) {
return getHeight(left) > getHeight(right) ? getHeight(left) : getHeight(right);
}
public static Node leftLeftNode(Node node) {
Node left = node.getLeft();
node.setLeft(left.getRight());
left.setRight(node);
node.setHeight(maxHeight(node.getLeft(), node.getRight()) + 1);
left.setHeight(maxHeight(left.getLeft(), left.getRight()) + 1);
return left;
}
public static Node rightRightNode(Node node) {
Node right = node.getRight();
node.setRight(right.getLeft());
right.setLeft(node);
node.setHeight(maxHeight(node.getLeft(), node.getRight()) + 1);
right.setHeight(maxHeight(right.getLeft(), right.getRight()) + 1);
return right;
}
public static Node leftRightNode(Node node) {
node.setLeft(rightRightNode(node.getLeft()));
return leftLeftNode(node);
}
public static Node rightLeftNode(Node node) {
node.setRight(leftLeftNode(node.getRight()));
return rightRightNode(node);
}
public static Node insetNode(Node node, int t) {
if (node == null) {
node = new Node(t);
}else {
if (t > node.getValue()) {
node.setRight(insetNode(node.getRight(), t));
} else {
node.setLeft(insetNode(node.getLeft(), t));
}
}
return balance(node);
}
private static Node balance(Node node) {
// ll
if (getHeight(node.left) > getHeight(node.right) && getHeight(node.left.left) > getHeight(node.left.right)) {
node = leftLeftNode(node);
}
// lr
if (getHeight(node.left) > getHeight(node.right) && getHeight(node.left.right) > getHeight(node.left.left)) {
node = leftRightNode(node);
}
// rr & r
if (getHeight(node.right) > getHeight(node.left) && getHeight(node.right.right) >= getHeight(node.right.left)) {
node = rightRightNode(node);
}
// rl
if (getHeight(node.right) > getHeight(node.left) && getHeight(node.right.left) > getHeight(node.right.right)) {
node = rightLeftNode(node);
}
node.height = maxHeight(node.left, node.right) + 1;
return node;
}
public static Node insert(Node tree, int key) {
if (tree == null) {
// 新建节点
tree = new Node(key);
} else {
if (key < tree.getValue()) { // 应该将key插入到"tree的左子树"的情况
tree.left = insert(tree.left, key);
// 插入节点后,若AVL树失去平衡,则进行相应的调节。
if (getHeight(tree.left) - getHeight(tree.right) == 2) {
if (key < tree.getLeft().getValue())
tree = leftLeftNode(tree);
else
tree = leftRightNode(tree);
}
} else if (key > tree.getValue()) { // 应该将key插入到"tree的右子树"的情况
tree.right = insert(tree.right, key);
// 插入节点后,若AVL树失去平衡,则进行相应的调节。
if (getHeight(tree.right) - getHeight(tree.left) == 2) {
if (key > tree.right.getValue())
tree = rightRightNode(tree);
else
tree = rightLeftNode(tree);
}
} else {
System.out.println("添加失败:不允许添加相同的节点!");
}
}
tree.height = maxHeight(tree.left, tree.right) + 1;
return tree;
}
public static void printAVL(Node node) {
if (node == null) {
return;
}
System.out.println(node.getValue() + "---------------------" + node.getHeight());
printAVL(node.getLeft());
printAVL(node.getRight());
}
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
Node node = null;
for (int i : arr) {
node = insetNode(node, i);
}
printAVL(node);
}