public class AVL {
class TreeNode{
int val;
int height;
TreeNode left;
TreeNode right;
TreeNode (int val){
this.val=val;
this.height=0;
}
public void print(){
if(left!=null) left.print();
System.out.printf("%s-",val);
if(right!=null) right.print();
}
public void printHeight(){
if(left!=null) left.printHeight();
System.out.printf("%s-",height);
if(right!=null) right.printHeight();
}
// 层序遍历打印,方便看结果;
public void printLevel(TreeNode root){
TreeNode temp=root;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(temp);
while(queue.size()>0){
int size =queue.size();
while(size-- > 0){
temp=queue.poll();
if(temp!=null){
System.out.printf("%s-%s ",temp.val,temp.height);
queue.offer(temp.left);
queue.offer(temp.right);
}else{
System.out.printf("%s ",null);
}
}
System.out.println();
}
}
}
// 计算高度
public int height(TreeNode node){
if(node==null) return -1;
int lh=node.left==null?-1:node.left.height;
int rh=node.right==null?-1:node.right.height;
return Math.max(lh+1,rh+1);
}
// 左旋
public TreeNode leftRotate(TreeNode root){
if(root==null) return null;
TreeNode temp= root.right;
root.right=temp.left;
temp.left=root;
// 修改经过调整后对的高度计数
root.height=height(root);
temp.height=height(temp);
return temp;
}
// 右旋
public TreeNode rightRotate(TreeNode root){
if(root==null) return null;
TreeNode temp=root.left;
root.left=temp.right;
temp.right=root;
// 修改经过调整后的高度计数
root.height=height(root);
temp.height=height(temp);
return temp;
}
// 插入
public TreeNode insert(TreeNode root,TreeNode node){
if(root==null) return node;
// 插入
if(root.val>node.val){
root.left=insert(root.left,node);
}else{
root.right=insert(root.right,node);
}
root.height=height(root);
// 判断是否需要调整结构及高度(也可以把下面的调整结构部分写在上面插入的条件判断里,因为上面已经区分了左右)
TreeNode leftChild = root.left;
TreeNode rightChild = root.right;
int lh=leftChild==null?-1:root.left.height;
int rh=rightChild==null?-1:root.right.height;
if(lh-rh>1){
int llh= height(leftChild.left);
int lrh= height(leftChild.right);
//
if(lrh>llh){
root.left=leftRotate(root.left);
}
root=rightRotate(root);
}else if(rh-lh>1){
int rlh=height(rightChild.left);
int rrh=height(rightChild.right);
if(rlh>rrh){
root.right=rightRotate(root.right);
}
root=leftRotate(root);
}
return root;
}
public TreeNode createTreeNode(int[] arr){
if(arr.length<1) return null;
TreeNode head = new TreeNode(arr[0]);
for(int i=1;i<arr.length;i++){
TreeNode node = new TreeNode(arr[i]);
head = insert(head,node);
}
return head;
}
public static void main(String[] args) {
int[] arr=new int[1000];
for(int i=0;i<1000;i++){
arr[i]=(int)Math.round(Math.random()*1000);
}
AVL avl=new AVL();
TreeNode node = avl.createTreeNode(arr);
node.print();
System.out.println();
node.printHeight();
System.out.println();
node.printLevel(node);
Queue<Integer> queue=new LinkedList<Integer>();
queue.offer(null);
System.out.println();
System.out.println(queue.size());
}
}
手写avl
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 由于拔牙术后感染在医院住了12天,回家后体力不支,烘焙无法开工,练字手腕没劲,重活做不了,出门多走两步路两腿发软,...
- 手写板是基于电脑的输入设备,其作用是给不喜欢用电脑键盘敲字或不会使用电脑键盘文字输入的人群提供帮助。随着时代的不断...