AVL树的java实现

package alogrithm;

public class AVLTree {
    //使用一个嵌套类来表示平很二叉树的节点
	private static class TreeNode{
		public int val;
		public TreeNode left;
		public TreeNode right;
		public int height;
		//构造函数
		public TreeNode(int element){
			this(element,null,null);
		}
		//
		public TreeNode(int element,TreeNode lt,TreeNode rt){
			val=element;
			left=lt;
			right=rt;
			height=0;
		}
	}
	//计算节点高度
    public int height(TreeNode t){
    	
    	return t==null?-1:t.height;
    }
    //平衡二叉树的插入
    public TreeNode insert(TreeNode t,int x){
    	if(t==null){
    		return new TreeNode(x);
    	}
    	if(t.val>x){
    		t.left=insert(t.left,x);
    		//插入左子树之后判断节点的平衡性
    		if(height(t.left)-height(t.right)==2){
    			if(x<t.left.val){
    				//左孩子的左子树,采用单旋转
    				t=rotateWithLeftChild(t);
    			}
    			else{
    				//左孩子的右子树,采用双旋转
    				t=doubleWithLeftChild(t);
    			}
    		}
    	}
    	else if(t.val<x){
    		t.right=insert(t.right,x);
    		//插入右子树之后判断节点的平衡性
    		if(height(t.right)-height(t.right)==2){
    			if(x>t.right.val){
    				//右孩子的右子树,采用单旋转
    				t=rotateWithRightChild(t);
    			}
    			else{
    				//右孩子的左子树,采用双旋转
    				t=doubleWithRightChild(t);
    			}
    		}
    	}	
    		t.height=Math.max(height(t.left),height(t.right))+1;
    		return t;
    }
    //左单旋转
    public TreeNode rotateWithLeftChild(TreeNode k2){
    	TreeNode k1=k2.left;
    	k2.left=k1.right;
    	k1.right=k2;
    	k2.height=Math.max(height(k2.left),height(k2.right))+1;
    	k1.height=Math.max(height(k1.left),k2.height)+1;
    	return k1;
    }
    //右单旋转
    public TreeNode rotateWithRightChild(TreeNode k2){
    	TreeNode k1=k2.right;
    	k2.right=k1.left;
    	k1.left=k2;
    	k2.height=Math.max(height(k2.left),height(k2.right))+1;
    	k1.height=Math.max(k2.height,height(k1.right))+1;
    	return k1;
    }
    //左双旋转
    public TreeNode doubleWithLeftChild(TreeNode k3){
          k3.left=rotateWithRightChild(k3.left);
          return rotateWithLeftChild(k3);
    }
    //右双旋转
    public TreeNode doubleWithRightChild(TreeNode k3){
          k3.right=rotateWithLeftChild(k3.right);
          return rotateWithRightChild(k3);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值