package com.haiyang.datastructure.avl;
public class AVLTreeDemo {
public static void main(String[] args) {
int[] ints = {10, 11, 7, 6, 8, 9};
AVLTree avlTree = new AVLTree();
Node avlTree1 = avlTree.createAVLTree(ints);
avlTree.preOrder(avlTree1);
}
}
class AVLTree {
private static Node tRoot = null;
public Node createAVLTree(int[] ints) {
for (int i = 0; i < ints.length; i++) {
Node node = new Node(ints[i]);
addNode(tRoot, node);
}
return tRoot;
}
public void preOrder(Node root) {
if (root == null) {
return;
}
System.out.println(root);
if (root.getLeft() != null) {
preOrder(root.getLeft());
}
if (root.getRight() != null) {
preOrder(root.getRight());
}
}
public static int leftHeight(Node node) {
if (node.getLeft() == null) {
return 0;
}
return node.getLeft().height();
}
public static int rightHeight(Node node) {
if (node.getRight() == null) {
return 0;
}
return node.getRight().height();
}
private static void leftRotate(Node node) {
Node newNode = new Node(node.getValue());
newNode.setLeft(node.getLeft());
newNode.setRight(node.getRight().getLeft());
node.setValue(node.getRight().getValue());
node.setRight(node.getRight().getRight());
node.setLeft(newNode);
}
private static void rightRotate(Node node) {
Node newNode = new Node(node.getValue());
newNode.setRight(node.getRight());
newNode.setLeft(node.getLeft().getRight());
node.setValue(node.getLeft().getValue());
node.setLeft(node.getLeft().getLeft());
node.setRight(newNode);
}
public static void addNode(Node root, Node node) {
if (node == null) {
System.out.println("添加的结点为空");
return;
} else if (tRoot == null) {
tRoot = node;
} else {
if (node.getValue() < root.getValue()) {
if (root.getLeft() == null) {
root.setLeft(node);
} else {
addNode(root.getLeft(), node);
}
} else {
if (root.getRight() == null) {
root.setRight(node);
} else {
addNode(root.getRight(), node);
}
}
if (rightHeight(root) - leftHeight(root) > 1) {
if (root.getRight() != null && leftHeight(root.getRight()) > rightHeight(root.getRight())) {
rightRotate(root.getRight());
leftRotate(root);
} else {
leftRotate(root);
}
return;
}
if (leftHeight(root) - rightHeight(root) > 1) {
if (root.getLeft() != null && rightHeight(root.getLeft()) > leftHeight(root.getLeft())) {
leftRotate(root.getLeft());
rightRotate(root);
} else {
rightRotate(root);
}
}
}
}
}
class Node {
private int value;
private Node left;
private Node right;
public Node() {
}
public Node(int value) {
this.value = value;
}
public int height() {
return Math.max(left == null ? 0 : left.height(), right == null ? 0 : right.height()) + 1;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
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;
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
'}';
}
}