packagecom.tomsnail.data.tree;/*** AVL二叉平衡树
*@authortomsnail
* @date 2015年3月30日 下午4:35:50*/
public classAVLTree {/*** 根节点
*@authortomsnail
* @date 2015年3月30日 下午4:36:54*/
privateAVLNode rootNode;private String bulidType = "";/*** 增加一个节点
*@authortomsnail
* @date 2015年3月30日 下午4:36:08*/
public void add(intvalue){
AVLNode subNode= null;if(rootNode==null){
subNode= newAVLNode(value);
rootNode=subNode;
}else{
subNode=addNode(rootNode,value);
}
reBuild(subNode);
}private AVLNode addNode(AVLNode node,intvalue){
AVLNode subNode= null;if(node.getValue()>value){if(node.getLeftNode()==null){
subNode= newAVLNode(value);
node.setLeftNode(subNode);
}else{
subNode=addNode(node.getLeftNode(), value);
}
}if(node.getValue()
subNode= newAVLNode(value);
node.setRightNode(subNode);
}else{
subNode=addNode(node.getRightNode(),value);
}
}returnsubNode;
}/*** 重平衡树
*@authortomsnail
* @date 2015年3月30日 下午5:42:00*/
private voidreBuild(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);
}
}
}
}/*** 左旋
*@authortomsnail
* @date 2015年3月30日 下午9:23:28*/
private voidRrotate(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);
}
}/*** 右旋
*@authortomsnail
* @date 2015年3月30日 下午9:23:28*/
private voidLrotate(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);
}
}/*** 查找最小不平衡的根节点
*@authortomsnail
* @date 2015年3月30日 下午5:40:55*/
privateAVLNode 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";
}returnnoB;
}private booleanisTypeLL(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 booleanisTypeRR(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 booleanisTypeLR(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 booleanisTypeRL(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;
}privateAVLNode getNoBalance(AVLNode node){if(node.getRootNode()==null){return null;
}else{if(!isBalance(node.getRootNode())){returnnode.getRootNode();
}else{returngetNoBalance(node.getRootNode());
}
}
}/*** 查找一个节点
*@authortomsnail
* @date 2015年3月30日 下午4:36:35*/
public AVLNode find(intvalue){returnfindWith2(rootNode,value);
}private AVLNode findWith2(AVLNode node,intvalue){if(node==null){return null;
}
System.out.println(node.getValue());if(node.getValue()>value){returnfindWith2(node.getLeftNode(),value);
}else if(node.getValue()
}else{returnnode;
}
}public voidmidScan(AVLNode node){if(node==null){return;
}
midScan(node.getLeftNode());
System.out.println(node.getValue());
midScan(node.getRightNode());
}publicAVLNode getRootNode() {returnrootNode;
}public static voidmain(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,80
AVLTree tree = newAVLTree();for(int i=0;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 intdepth(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 booleanisBalance(AVLNode node){if (node==null)return true;int dis = depth(node.getLeftNode()) -depth(node.getRightNode());if (dis>1 || dis
return isBalance(node.getLeftNode()) &&isBalance(node.getRightNode());
}
}classAVLNode{private intvalue;privateAVLNode leftNode;privateAVLNode rightNode;privateAVLNode rootNode;public intgetValue() {returnvalue;
}public void setValue(intvalue) {this.value =value;
}publicAVLNode getLeftNode() {returnleftNode;
}public voidsetLeftNode(AVLNode leftNode) {this.leftNode =leftNode;if(leftNode!=null){
leftNode.setRootNode(this);
}
}publicAVLNode getRightNode() {returnrightNode;
}public voidsetRightNode(AVLNode rightNode) {this.rightNode =rightNode;if(rightNode!=null){
rightNode.setRootNode(this);
}
}publicAVLNode getRootNode() {returnrootNode;
}public voidsetRootNode(AVLNode rootNode) {this.rootNode =rootNode;
}public booleanhasSubNode(){if(this.leftNode!=null||this.rightNode!=null){return true;
}else{return false;
}
}publicAVLNode(){
}public AVLNode(intvalue){this.value =value;
}
}