保持平衡策略:保持平衡因子(树任意节点的深度)不能相差2。
左旋转:
右旋转
左旋右旋
右旋左旋
java实现
AVLNode root; public void add(String key){ root=insertAVLNode(root,key); } public void remove(String key){ root=removeAVLNode(root,key); } private AVLNode removeAVLNode(AVLNode avlNode,String key){ if(avlNode!=null){ int tmp=key.compareTo(avlNode.key); if(tmp>0){ avlNode.right=removeAVLNode(avlNode.right,key); }else if(tmp<0){ avlNode.left=removeAVLNode(avlNode.left,key); }else{ avlNode=removeNode(avlNode); } fixHeight(avlNode); int nodeHeight=getHeight(avlNode.right)-getHeight(avlNode.left); if(nodeHeight==-2){ avlNode=fixLeftImbalance(avlNode); }else if(nodeHeight==2){ avlNode=fixRightImbalance(avlNode); } } return avlNode; } private AVLNode removeNode(AVLNode avlNode){ if(avlNode.left==null){ avlNode=avlNode.right; }else if(avlNode.right==null){ avlNode=avlNode.left; }else{ AVLNode tmpNode=avlNode.left; while(tmpNode.right!=null){ tmpNode=tmpNode.right; } avlNode.key=tmpNode.key; avlNode.left=removeAVLNode(avlNode.left,tmpNode.key); } return avlNode; } private AVLNode insertAVLNode(AVLNode avlNode,String key){ if(avlNode==null){ avlNode=new AVLNode(); avlNode.height=0; avlNode.key=key; avlNode.left=avlNode.right=null; }else{ int tmp=key.compareTo(avlNode.key); if(tmp>0){ avlNode.right=insertAVLNode(avlNode.right,key); }else if(tmp<0){ avlNode.left=insertAVLNode(avlNode.left,key); } fixHeight(avlNode); int nodeHeight=getHeight(avlNode.right)-getHeight(avlNode.left); if(nodeHeight==-2){ avlNode=fixLeftImbalance(avlNode); }else if(nodeHeight==2){ avlNode=fixRightImbalance(avlNode); } } return avlNode; } private AVLNode fixLeftImbalance(AVLNode avlNode){ if(getHeight(avlNode.right)>getHeight(avlNode.left)){ avlNode.left=rotateLeft(avlNode.left); } return rotateRight(avlNode); } private AVLNode fixRightImbalance(AVLNode avlNode){ if(getHeight(avlNode.right)>getHeight(avlNode.left)){ avlNode.left=rotateRight(avlNode.left); } return rotateLeft(avlNode); } private AVLNode rotateRight(AVLNode avlNode){ AVLNode leftNode=avlNode.left; avlNode.left=leftNode.right; leftNode.right=avlNode; fixHeight(avlNode); fixHeight(leftNode); return leftNode; } private AVLNode rotateLeft(AVLNode avlNode){ AVLNode rightNode=avlNode.right; avlNode.right=rightNode.left; rightNode.left=avlNode; fixHeight(avlNode); fixHeight(rightNode); return rightNode; } private Integer getHeight(AVLNode avlNode){ return avlNode==null?-1:avlNode.height; } private void fixHeight(AVLNode avlNode){ if(avlNode!=null){ avlNode.height=Math.max(getHeight(avlNode.left),getHeight(avlNode.right))+1; } } public void display(){ display(root); } private void display(AVLNode avlNode){ if(avlNode!=null){ System.out.printf("key:\t%s\th:\t%d\tbf:\t%d\r\n",avlNode.key,avlNode.height,getHeight(avlNode.right)-getHeight(avlNode.left)); display(avlNode.left); display(avlNode.right); } } public AVLTreeTest() { } private class AVLNode{ int height; String key; AVLNode left,right; }