public Node remove(Node node,int data){
if( node == null )
return null;
Node retNode=node;
if (data==node.data){
if (node.left!=null&&node.right!=null){
Node min = findMin(node.right);
Node remove = remove(node.right, node.right.data);
node.right=remove;
node.data=min.data;
retNode=node;
}else if (node.left!=null){
retNode= node.left;
}
else if (node.right!=null){
retNode= node.right;
}else{
return null;
}
}
if (node.data>data){
node.left= remove(node.left,data);
}
if (node.data<data){
node.right=remove(node.right,data);
}
retNode.heigh= Math.max(getHeigh(retNode.left),getHeigh(retNode.right))+1;
int balance = getBalance(retNode);
//LL
if (balance<-1&&getBalance(retNode.right)<=0){
return leftRoate(retNode);
}
//RR
if (balance>1&&getBalance(retNode.left)>=0){
return rightRoate(retNode);
}
//LR
if (balance>1&&getBalance(retNode.left)<0){
retNode.left=leftRoate(retNode.left);
return rightRoate(retNode);
}
//RL
if (balance<-1&&getBalance(retNode.right)>0){
retNode.right=rightRoate(retNode.right);
return leftRoate(retNode);
}
return retNode;
}
删除一个节点,回溯到父节点重新计算平衡因子,和插入操作计算一模一样