JAVA实现,以及JFrame 结果展示
package com.example.fndemo.tree;
import java.util.Stack;
public class AVLTree {
Node<Integer> rootNode;
public static void main(String[] args) {
Integer[] datas = {
2, 1, 0, 3, 4, 5, 6, 9, 8, 7};
AVLTree avlTree = new AVLTree();
for (Integer data : datas) {
avlTree.insert(data);
}
avlTree.midTraversing();
System.out.println();
DrawTree drawTree = new DrawTree(avlTree.rootNode);
}
public void insert(Integer data) {
if (null == rootNode) {
rootNode = new Node<Integer>(data);
return;
}
Node insert = new Node<Integer>(data).insert(rootNode);
this.adjust(insert);
System.out.println("是否插入成功:" + (null != insert.getParent()) + " 当前key:" + insert.getKey() + " 父亲key:" + (null == insert.getParent() ? null : insert.getParent().getKey()));
}
public Node<Integer> getRootNode() {
return rootNode;
}
public void adjust(Node leafNode){
Node current = leafNode;
int index=1;
while (current!=null&&index<5){
if (current.getBalance() > 1) {
if (current.getLeftChild().getBalance() < 0) {
rotateLeft(current.getLeftChild());
}
rotateRight(current);
return;
}
if (current.getBalance() < -1) {
if (current.getRightChild().getBalance() > 0) {
rotateRight(current.getRightChild());
}
rotateLeft(current);
return;
}
current=current.getParent();
index++;
}
}
public void rotateLeft(Node currentNode){
Node parent = currentNode.getParent();
Node rightChild = currentNode.getRightChild();
Node rightChildLeftChild = rightChild.getLeftChild();
currentNode.setParent(rightChild);
currentNode.setRightChild(rightChildLeftChild);
rightChild.setParent(parent);
rightChild.setLeftChild(currentNode);
if (parent != null) {
if (parent.getRightChild().equals(currentNode)) {
parent.setRightChild(rightChild);
}
if (parent.getLeftChild().equals(currentNode)) {
parent.setRightChild(rightChild);
}
}else{
rootNode=rightChild;
}
if (null != rightChildLeftChild) {
rightChildLeftChild.setParent(currentNode);
}
}
public void rotateRight(Node currentNode){
Node parent = currentNode.getParent();
Node leftChild = currentNode.getLeftChild();
Node leftChildRightChild = leftChild.getRightChild();
leftChild.setRightChild(currentNode);
leftChild.setParent(parent);
currentNode.setParent(leftChild);
currentNode.setLeftChild(leftChildRightChild);