package com.tomsnail.data.tree; /*** AVL二叉平衡树* @author tomsnail* @date 2015年3月30日 下午4:35:50*/ public class AVLTree {/*** 根节点* @author tomsnail* @date 2015年3月30日 下午4:36:54*/private AVLNode rootNode;private String bulidType = "";/*** 增加一个节点* @author tomsnail* @date 2015年3月30日 下午4:36:08*/public void add(int value){AVLNode subNode = null;if(rootNode==null){subNode = new AVLNode(value);rootNode = subNode;}else{ subNode = addNode(rootNode,value);}reBuild(subNode);}private AVLNode addNode(AVLNode node,int value){AVLNode subNode = null;if(node.getValue()>value){if(node.getLeftNode()==null){subNode = new AVLNode(value);node.setLeftNode(subNode);}else{subNode = addNode(node.getLeftNode(), value);}}if(node.getValue()<value){if(node.getRightNode()==null){subNode = new AVLNode(value);node.setRightNode(subNode);}else{subNode = addNode(node.getRightNode(),value);}}return subNode;}/*** 重平衡树* @author tomsnail* @date 2015年3月30日 下午5:42:00*/private void reBuild(AVLNode node){if(node!=null){AVLNode tempRootNode = findTempRootNode(node);if(tempRootNode!=null){if(bulidType.equals("ll")){Lrotate(node,tempRootNode);}else if(bulidType.equals("rr")){Rrotate(node,tempRootNode);}else if(bulidType.equals("lr")){Rrotate(node,tempRootNode.getLeftNode());Lrotate(node,tempRootNode);}else if(bulidType.equals("rl")){Lrotate(node,tempRootNode.getRightNode());Rrotate(node,tempRootNode);}}}}/*** 左旋* @author tomsnail* @date 2015年3月30日 下午9:23:28*/private void Rrotate(AVLNode node,AVLNode tempRootNode){AVLNode rotateNode = tempRootNode.getRightNode();AVLNode rootNode = tempRootNode.getRootNode();String type = "";if(rootNode!=null){if(rootNode.getLeftNode()==tempRootNode){type="l";}else{type="r";}}AVLNode adjustNode = rotateNode.getLeftNode();rotateNode.setLeftNode(tempRootNode);tempRootNode.setRightNode(null);if(adjustNode!=null){tempRootNode.setRightNode(adjustNode);}if(rootNode==null){rotateNode.setRootNode(null);this.rootNode = rotateNode;}if(type.equals("r")){rootNode.setRightNode(rotateNode);}else if(type.equals("l")){rootNode.setLeftNode(rotateNode);}}/*** 右旋* @author tomsnail* @date 2015年3月30日 下午9:23:28*/private void Lrotate(AVLNode node,AVLNode tempRootNode){AVLNode rotateNode = tempRootNode.getLeftNode();AVLNode rootNode = tempRootNode.getRootNode();String type = "";if(rootNode!=null){if(rootNode.getLeftNode()==tempRootNode){type="l";}else{type="r";}}AVLNode adjustNode = rotateNode.getRightNode();rotateNode.setRightNode(tempRootNode);tempRootNode.setLeftNode(null);if(adjustNode!=null){tempRootNode.setLeftNode(adjustNode);}if(rootNode==null){rotateNode.setRootNode(null);this.rootNode = rotateNode;}if(type.equals("r")){rootNode.setRightNode(rotateNode);}else if(type.equals("l")){rootNode.setLeftNode(rotateNode);}}/*** 查找最小不平衡的根节点* @author tomsnail* @date 2015年3月30日 下午5:40:55*/private AVLNode findTempRootNode(AVLNode node){AVLNode noB = getNoBalance(node);if(noB==null){return null;}if(isTypeLL(noB)){bulidType = "ll";}else if(isTypeRR(noB)){bulidType = "rr";}else if(isTypeLR(noB)){bulidType = "lr";}else if(isTypeRL(noB)){bulidType = "rl";}return noB;}private boolean isTypeLL(AVLNode noB){try {if(noB.getRightNode()==null&&noB.getLeftNode().getRightNode()==null&&!noB.getLeftNode().getLeftNode().hasSubNode()){return true;}if(noB.getRightNode()!=null&&noB.getLeftNode().getRightNode()!=null&&noB.getLeftNode().getLeftNode().hasSubNode()){return true;}} catch (Exception e) {}return false;}private boolean isTypeRR(AVLNode noB){try {if(noB.getLeftNode()==null&&noB.getRightNode().getLeftNode()==null&&!noB.getRightNode().getRightNode().hasSubNode()){return true;}if(noB.getLeftNode()!=null&&noB.getRightNode().getLeftNode()!=null&&noB.getRightNode().getRightNode().hasSubNode()){return true;}} catch (Exception e) {}return false;}private boolean isTypeLR(AVLNode noB){try {if(noB.getRightNode()==null&&noB.getLeftNode().getLeftNode()==null&&!noB.getLeftNode().getRightNode().hasSubNode()){return true;}if(noB.getRightNode()!=null&&noB.getLeftNode().getLeftNode()!=null&&noB.getLeftNode().getRightNode().hasSubNode()){return true;}} catch (Exception e) {}return false;}private boolean isTypeRL(AVLNode noB){try {if(noB.getLeftNode()==null&&noB.getRightNode().getRightNode()==null&&!noB.getRightNode().getLeftNode().hasSubNode()){return true;}if(noB.getLeftNode()!=null&&noB.getRightNode().getRightNode()!=null&&noB.getRightNode().getLeftNode().hasSubNode()){return true;}} catch (Exception e) {}return false;}private AVLNode getNoBalance(AVLNode node){if(node.getRootNode()==null){return null;}else{if(!isBalance(node.getRootNode())){return node.getRootNode();}else{return getNoBalance(node.getRootNode());}}}/*** 查找一个节点* @author tomsnail* @date 2015年3月30日 下午4:36:35*/public AVLNode find(int value){return findWith2(rootNode,value);}private AVLNode findWith2(AVLNode node,int value){if(node==null){return null;}System.out.println(node.getValue());if(node.getValue()>value){return findWith2(node.getLeftNode(),value);}else if(node.getValue()<value){return findWith2(node.getRightNode(),value);}else{return node;}}public void midScan(AVLNode node){if(node==null){return;}midScan(node.getLeftNode());System.out.println(node.getValue());midScan(node.getRightNode());}public AVLNode getRootNode() {return rootNode;}public static void main(String[] args) {int[] is = new int[]{10,11,23,3,5,44,32,4,6,18,19,7,8,70,50,60,40,55,65,53,80};//10,11,23,3,5,44,32,4,6,18,19,7,8,70,50,60,40,55,65,53,80AVLTree tree = new AVLTree();for(int i=0;i<is.length;i++){tree.add(is[i]);}System.out.println(tree.getRootNode().getValue());System.out.println("----------------------------");tree.midScan(tree.getRootNode());System.out.println(isBalance(tree.getRootNode()));}public static int depth(AVLNode node){if(node==null){return 0;}else{ int ld = depth(node.getLeftNode()); int rd = depth(node.getRightNode()); return 1 + (ld >rd ? ld : rd); }}public static boolean isBalance(AVLNode node){ if (node==null) return true; int dis = depth(node.getLeftNode()) - depth(node.getRightNode()); if (dis>1 || dis<-1 ) return false; else return isBalance(node.getLeftNode()) && isBalance(node.getRightNode());} }class AVLNode{private int value;private AVLNode leftNode;private AVLNode rightNode;private AVLNode rootNode;public int getValue() {return value;}public void setValue(int value) {this.value = value;}public AVLNode getLeftNode() {return leftNode;}public void setLeftNode(AVLNode leftNode) {this.leftNode = leftNode;if(leftNode!=null){leftNode.setRootNode(this);}}public AVLNode getRightNode() {return rightNode;}public void setRightNode(AVLNode rightNode) {this.rightNode = rightNode;if(rightNode!=null){rightNode.setRootNode(this);}}public AVLNode getRootNode() {return rootNode;}public void setRootNode(AVLNode rootNode) {this.rootNode = rootNode;}public boolean hasSubNode(){if(this.leftNode!=null||this.rightNode!=null){return true;}else{return false;}}public AVLNode(){}public AVLNode(int value){this.value = value;} }