An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.
Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (≤20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the root of the resulting AVL tree in one line.
Sample Input 1:
5
88 70 61 96 120
Sample Output 1:
70
Sample Input 2:
7
88 70 61 96 120 90 65
Sample Output 2:
88
思路:
根据给出的序列逐一插入树中,在插入过程中判断一旦出现需要调整的情况,立即对AVL树进行调整;
代码如下:
import java.io.BufferedReader;
import java.io.FileDescriptor;
import java.io.FileReader;
public class Main {
AVLNode tree = null;
public static void main(String[] args){
Main self = new Main();
BufferedReader br = new BufferedReader(new FileReader(FileDescriptor.in));
try {
int[] nodes = self.readInput(br);
AVLNode head = self.buildAVLTree(nodes, self.tree);
System.out.print(head.getData());
} catch (Exception e) {
e.printStackTrace();
}
}
//读取输入信息
public int[] readInput(BufferedReader br) throws Exception{
int num = Integer.parseInt(br.readLine().trim());
String[] s = br.readLine().trim().split(" ");
int[] nodes = new int[num];
for (int i = 0; i < num; i++) {
nodes[i] = Integer.parseInt(s[i]);
}
return nodes;
}
//插入节点,形成一颗AVL树
public AVLNode buildAVLTree(int[] nodes,AVLNode tree){
for (int i = 0; i < nodes.length; i++) {
tree = insertNode(tree,nodes[i]);
}
return tree;
}
//插入一个节点
private AVLNode insertNode(AVLNode head, int data){
if (head == null){
return new AVLNode(data);
}
//插入右子树
if (data > head.getData()){
head.right = insertNode(head.right,data);
head.setHeight(max(getTreeHeight(head.left),getTreeHeight(head.right)) + 1);
int temp = head.getData();
if (getTreeHeight(head.left) - getTreeHeight(head.right)== -2){
if (head.right.getData() > data){
head = rightLeftRotation(head);
}else {
head = singleRightRotation(head);
}
}
}
//插入左子树
if (data < head.getData()){
int headData = head.getData();
head.left = insertNode(head.left,data);
head.setHeight(max(getTreeHeight(head.left),getTreeHeight(head.right)) + 1);
if (getTreeHeight(head.left) - getTreeHeight(head.right)== 2){
if (head.left.getData() < data){
head = leftRightRotation(head);
}else {
head = singleLeftRotation(head);
}
}
}
return head;
}
private int max(int a, int b){
return a>b?a:b;
}
//右单旋
private AVLNode singleRightRotation(AVLNode head){
AVLNode right = head.right;
AVLNode temp = right.left;
right.left = head;
head.right = temp;
head.setHeight(max(getTreeHeight(head.left),getTreeHeight(head.right)) + 1);
right.setHeight(max(getTreeHeight(right.left),getTreeHeight(right.right)) + 1);
return right;
}
//左单旋
private AVLNode singleLeftRotation(AVLNode head){
AVLNode left = head.left;
AVLNode temp = left.right;
left.right = head;
head.left = temp;
head.setHeight(max(getTreeHeight(head.left),getTreeHeight(head.right)) + 1);
left.setHeight(max(getTreeHeight(left.left),getTreeHeight(left.right)) + 1);
return left;
}
//左右旋转
private AVLNode leftRightRotation(AVLNode head){
head.left = singleRightRotation(head.left);
return singleLeftRotation(head);
}
//右左旋转
private AVLNode rightLeftRotation(AVLNode head){
head.right = singleLeftRotation(head.right);
return singleRightRotation(head);
}
//获得一个节点的高度
private int getTreeHeight(AVLNode head){
if (head == null){
return 0;
}
return head.getHeight();
}
}
class AVLNode{
private int data;
AVLNode left;
AVLNode right;
private int height;
public AVLNode(int data) {
this.data = data;
this.left = null;
this.right = null;
this.height = 1;
}
public AVLNode() { }
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public int getHeight() {
return this.height;
}
public void setHeight(int height) {
this.height = height;
}
}