平衡二叉树 java

只写了添加节点部分,删除并没有写, 各种情况的转换在代码中间部分有配图注释

/**
 * 
 * @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();
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值