AVL樹-刪除操作(維護平衡的操作)
阿新 • • 發佈:2021-01-30
技術標籤:二分搜尋樹
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;
}
刪除一個節點,回溯到父節點重新計算平衡因子,和插入操作計算一模一樣