1066 Root of AVL Tree (25 分)
import java.util.Scanner;
/**
* @author RabbiT
* 1066 Root of AVL Tree (25 分)
*/
public class Main01 {
/**
* 树节点类
*/
public static class TreeNode{
int value;
int depth;
TreeNode left;
TreeNode right;
TreeNode(int value){
this.value = value;
this.depth = 1;
this.left = null;
this.right = null;
}
}
/**
* 获取当前树节点的高度
* @param root
* @return
*/
public int getDepth(TreeNode root){
if(root == null){
return 0;
}
return root.depth;
}
/**
* 获取当前树节点的平衡因子 五种情况
* @param root
* @return
*/
public int getBalanceFactor(TreeNode root){
if(root == null){
return 0;
}
if(root.left == null && root.right == null){
return 0;
}else if(root.left == null){
return -getDepth(root.right);
}else if(root.right == null){
return getDepth(root.left);
}else{
return getDepth(root.left) - getDepth(root.right);
}
}
/**
* 调整后的树需要更新节点的最新深度
* @param root
*/
public void updateDepth(TreeNode root){
if(root.left == null && root.right == null){
root.depth = 1;
}else if(root.right == null){
root.depth = getDepth(root.left) + 1;
}else if(root.left == null){
root.depth = getDepth(root.right) + 1;
}else{
root.depth = Math.max(getDepth(root.left),getDepth(root.right)) + 1;
}
}
/**
* 当遇到节点平衡因子为负数时 -1 -2 需要左旋
* @param root
* @return
*/
public TreeNode leftCircle(TreeNode root){
TreeNode temp = root.right;
root.right = temp.left;
temp.left = root;
updateDepth(root);
updateDepth(temp);
root = temp;
return root;
}
/**
* 当遇到节点平衡因子为正数时 1 2 需要右旋
* @param root
* @return
*/
public TreeNode rightCircle(TreeNode root){
TreeNode temp = root.left;
root.left = temp.right;
temp.right = root;
updateDepth(root);
updateDepth(temp);
root = temp;
return root;
}
/**
* 和二叉搜索树一致
* @param root
* @param value
* @return
*/
public boolean search(TreeNode root,int value){
if(root == null){
return false;
}
if(value == root.value){
return true;
}else if(value < root.value){
return search(root.left,value);
}else{
return search(root.right,value);
}
}
/**
* 二叉平衡树进行插入节点操作 需要调整
* @param root
* @param node
* @return
*/
public TreeNode insert(TreeNode root,TreeNode node){
if(root.value > node.value){
if(root.left == null){
root.left = node;
}else{
root.left = insert(root.left,node);
}
}else{
if(root.right == null){
root.right = node;
}else{
root.right = insert(root.right,node);
}
}
updateDepth(root);
root = adjustBalance(root);
return root;
}
/**
* 平衡因子为 2 -2需要调整二叉树
* @param root
* @return
*/
public TreeNode adjustBalance(TreeNode root) {
//为正数 则是L型 有LL LR两种
if(getBalanceFactor(root) == 2){
if(getBalanceFactor(root.left) == 1){
root = rightCircle(root);
}else if(getBalanceFactor(root.left) == -1){
root.left = leftCircle(root.left);
root = rightCircle(root);
}
}else if(getBalanceFactor(root) == -2){
if(getBalanceFactor(root.right) == -1){
root = leftCircle(root);
}else if(getBalanceFactor(root.right) == 1){
root.right = rightCircle(root.right);
root = leftCircle(root);
}
}
return root;
}
public TreeNode createTree(TreeNode[] treeArr){
TreeNode root = treeArr[0];
for(int i = 1;i<treeArr.length;i++){
root = insert(root,treeArr[i]);
}
return root;
}
public static void main(String[] args) {
Main01 main = new Main01();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
TreeNode[] treeArr = new TreeNode[n];
for(int i = 0;i<n;i++){
treeArr[i] = new TreeNode(sc.nextInt());
}
TreeNode root = main.createTree(treeArr);
System.out.println(root.value);
System.out.println(root.left.value);
System.out.println(root.right.value);
}
}