只写了添加节点部分,删除并没有写, 各种情况的转换在代码中间部分有配图注释
/**
*
* @author rq
*
*/
class Node{
Node right;
Node left;
Node parent;
Integer value=null;
int balance=0;
public Node(){
}
public void addValue(Integer value){
this.value=value;
}
public Integer compare(Integer v){
if(value>v)
return 1;//left
else
return 0;//right
}
}
class Tree{
private static final int LH=1;
private static final int RH=-1;
private static final int EH=0;
Node root = new Node();
public void add(Integer value){
Node curNode = root;
if(curNode.value==null){
root.addValue(value); // add value into root node
root.balance=0; // add balance to root node
return;
}
while(true){
if(value==curNode.value)
return;
else if(curNode.compare(value)==1){ //left node
if(curNode.left==null){
Node newNode = new Node();
curNode.left=newNode;
newNode.parent=curNode;
}
curNode=curNode.left;
}
else{
if(curNode.right==null){
Node newNode = new Node();
curNode.right=newNode;
newNode.parent=curNode;
}
curNode=curNode.right;
}
if(curNode.value==null){
curNode.addValue(value);
checkBalance(curNode);
return;
}
}
}
public void checkBalance(Node curNode){
Node n = curNode; // check special condition , only parent.balance change
Node parent=null;
if(curNode.parent!=null)
parent=curNode.parent;
while(parent!=null){
if(parent.right==curNode){
parent.balance--; //current node is right node
if(n==n.parent.right&&n.parent.left!=null) //check whether change parent.balance only
break;
}
if(parent.left==curNode){
parent.balance++; // current node is left node
if(n==n.parent.left&&n.parent.right!=null)
break;
}
//if(parent.balance==0)
// break;
if(parent.balance==2){
System.out.println(parent.value);
leftRebalance(parent); //rebalance left tree
break;
}
if(parent.balance==-2){
System.out.println(parent.value);
rightRebalance(parent); // rebalance right tree
break;
}
//if(parent.parent!=null)
curNode=parent;
parent = parent.parent;
}
return;
}
/*--------------------------------------------------------------------------------
* LLH | a b
* a b | / \ / \
* / / \ | b c d a
* b ---->>> c a | / \ --->> / / \
* / | d f e f c
* c | /
* | e
* ------------------------------------------------------------------------------
* RRH | a c
* a b | / \ / \
* \ / \ | b c a e
* b ----->>> a c | / \ --->>> / \ \
* \ | d e b d f
* c | \
* | f
* ----------------------------------------------------------------------------
* LRH = RRH + LLH
* a a e
* / / / \ balance a: 2 -> 0 case 1
* b --->> e --->> b a b:-1 -> 0
* \ / e: 0 -> 0
* e b
*
*
* a a e
* / \ / \ / \
* b c e c b a balance a: 2 -> 0 case 2
* / \ ---->> / \ --> / / \ b:-1 -> 1
* d e b f d f c e:-1 -> 0
* \ /
* f d
*
* a a e
* / \ / \ / \
* b c e c b a balance a: 2 -> -1 case 3
* / \ ---->> / --> / \ \ b:-1 -> 0
* d e b d f c e: 1 -> 0
* / / \
* f d f
*
* a a e
* / \ / \ / \
* b c e c b a balance a: 2 -> 0 case 1
* / \ --->> / \ --> / \ / \ b:-1 -> 0
* d e b g d f g c e: 0 -> 0
* / \ / \
* f g d f
* ------------------------------------------------------------------------------
* RLH = LLH + RRH
* a a e
* \ \ / \
* b --->>> e -->> a b
* / \
* e b
*
* a a e
* / \ / \ / \
* c b -->> c e -->> a b
* / \ / \ / \ \
* e d f b c f d
* / \
* f d
*
* a a e
* / \ / \ / \
* c b -->> c e -->> a b
* / \ \ / / \
* e d b c f d
* \ / \
* f f d
*
* a a e
* / \ / \ / \
* c b -->> c e -->> a b
* / \ / \ / \ / \
* e d f b c f g d
* / \ / \
* f g g d
*
*
*
*
*
*/
public void leftRebalance(Node curNode){
//curNode is the node which balance==2
//curNode is a
// l is b
Node l = curNode.left;
switch(l.balance){
case LH:
// LLH
curNode.balance=l.balance=EH;
rotateRight(curNode);
break;
case RH:
// LRH
switch(l.right.balance){
//e.balance
case EH:
//case 1
l.balance=curNode.balance=EH;
break;
case RH:
//case 2
curNode.balance=EH;
l.balance=LH;
break;
case LH:
//case 3
curNode.balance=RH;
l.balance=EH;
break;
}
l.right.balance=EH; //e.balance = 0
rotateLeft(l);
rotateRight(curNode);
break;
}
}
public void rightRebalance(Node curNode){
//curNode is the node which balance==-2
Node r = curNode.right;
switch(r.balance){
case RH:
curNode.balance=r.balance=EH;
rotateLeft(curNode); // RRH
break;
case LH:
// RLH
switch(r.left.balance){
//e.balance
case EH:
//case 1
r.balance=curNode.balance=EH;
break;
case LH:
//case 2
curNode.balance=EH;
r.balance=RH;
break;
case RH:
//case 3
curNode.balance=LH;
r.balance=EH;
break;
}
r.left.balance=EH; //e.balance = 0
rotateRight(r);
rotateLeft(curNode);
break;
}
}
public void rotateRight(Node curNode){
//curNode balance ==2
Node left=curNode.left;
if(curNode.parent!=null){
if(curNode.parent.left==curNode)
curNode.parent.left=left; //curNode is parent's left child,then reset it
if(curNode.parent.right==curNode)
curNode.parent.right=left; //curNode is parent's right child,then reset it
left.parent=curNode.parent;
}
if(curNode.parent==null){
root=left; //if curNode is root,then set left Node becomes root Node
left.parent=null;
}
if(left.right!=null){
curNode.left=left.right;
left.right.parent=curNode;
}
curNode.parent=left;
left.right=curNode;
}
public void rotateLeft(Node curNode){
//curNode balance ==-2
Node right=curNode.right;
if(curNode.parent!=null){
if(curNode.parent.left==curNode)
curNode.parent.left=right; //curNode is parent's left child,then reset it
if(curNode.parent.right==curNode)
curNode.parent.right=right; //curNode is parent's right child,then reset it
right.parent=curNode.parent;
}
if(curNode.parent==null){
root=right; //if curNode is root,then set left Node becomes root Node
right.parent=null;
}
if(right.left!=null){
curNode.right=right.left;
right.left.parent=curNode;
}
curNode.parent=right;
right.left=curNode;
}
public void show(){
}
}
public class AVL {
public static void main(String[] args){
Tree tree = new Tree();
tree.add(6);
tree.add(5);
tree.add(15);
tree.add(9);
tree.add(17);
tree.add(10);
tree.show();
}
}