您的位置:首页 > 编程语言

平衡二叉树(AVL树)一图一步骤代码实现左旋右旋,左右平衡操作

2017-11-22 10:36 447 查看
/**
*@version创建时间:2017-11-21下午10:10:27
*类说明:AVL树
*/
publicclassAVLTree<EextendsComparable<E>>{
Node<E>root;
intsize=0;
privatestaticfinalintLH=1;
privatestaticfinalintRH=-1;
privatestaticfinalintEH=0;

/**
*类说明:定义类
*/
publicclassNode<EextendsComparable<E>>{
Eelemet;
intbalance=0;
Node<E>left;
Node<E>right;
Node<E>parent;

publicNode(Eelem,Node<E>pare){
this.elemet=elem;
this.parent=pare;
}

publicEgetElemet(){
returnelemet;
}

publicvoidsetElemet(Eelemet){
this.elemet=elemet;
}

publicintgetBalance(){
returnbalance;
}

publicvoidsetBalance(intbalance){
this.balance=balance;
}

publicNode<E>getLeft(){
returnleft;
}

publicvoidsetLeft(Node<E>left){
this.left=left;
}

publicNode<E>getRight(){
returnright;
}

publicvoidsetRight(Node<E>right){
this.right=right;
}

publicNode<E>getParent(){
returnparent;
}

publicvoidsetParent(Node<E>parent){
this.parent=parent;
}
}
/**
*左旋(对节点X进行左旋)
*rγαβ
*如上图
*/
publicvoidleft_rotate(Node<E>x){
if(x==null){
return;}
Node<E>Y=x.left;
Node<E>parent=x.parent;
//step1:x的右子指向β
x.right=Y.left;
if(Y.left!=null){
Y.left.parent=x;}

//step2:Y的左子指向X
Y.parent=x.parent;
if(x.parent==null){
root=Y;}else{
if(parent.left==x){
parent.left=Y;}elseif(parent.right==x){
parent.right=Y;}}

//step3:x的父指向Y
Y.left=x;
x.parent=Y;
}
/**
*右旋(对节点Y进行右旋)
*rγαβ
*/
publicvoidright_rotate(Node<E>Y){
if(Y==null){
return;}
Node<E>x=Y.left;
Node<E>parent=Y.parent;
//step1:Y的左子指向β
Y.left=x.right;
if(x.right!=null){
x.right.parent=Y;}

//step2:X的右子指向Y
Y.parent=x.parent;
if(x.parent==null){
root=Y;}else{
if(parent.left==Y){
parent.left=x;}elseif(parent.right==Y){
parent.right=x;}}

//step3:x的父指向parent
x.right=Y;
Y.parent=x;
}
/**
*右平衡操作,即结点t的不平衡是因为右子树过深
*/
publicvoidrightBalance(Node<E>t){
Node<E>tr=t.right;
switch(tr.balance){
caseRH://如果新的结点插入到t的右孩子的右子树中,则直接进行左旋操作即可
left_rotate(t);
t.balance=EH;
tr.balance=EH;
break;
caseLH://如果新的结点插入到p的右孩子的左子树中,则需要进行分情况讨论
Node<E>trl=tr.left;
switch(trl.balance){
caseLH://情况a:当p的右孩子的左子树根节点的balance=LH
t.balance=EH;
tr.balance=RH;
trl.balance=EH;
break;
caseRH://情况b:当p的右孩子的左子树根节点的balance=RH
t.balance=LH;
tr.balance=EH;
trl.balance=EH;
break;
caseEH://情况C:当p的右孩子的左子树根节点的balance=EH
t.balance=EH;
tr.balance=EH;
trl.balance=EH;
break;}
//旋转
right_rotate(t.right);
left_rotate(t);
break;
caseEH:
break;}}
/**
*左平衡
*/
publicvoidleftBalance(Node<E>t){
Node<E>tl=t.right;
switch(tl.balance){
caseRH://如果新的结点插入到t的左孩子的左子树中,则直接进行右旋操作即可
right_rotate(t);
tl.balance=EH;
t.balance=EH;
break;
caseLH://如果新的结点插入到t的左孩子的右子树中,则需要进行分情况讨论
Node<E>tlr=tl.right;
switch(tlr.balance){
caseRH://情况a:当t的左孩子的右子树根节点的balance=RH
t.balance=EH;
tl.balance=LH;
tlr.balance=EH;
break;
caseLH://情况b:当p的左孩子的右子树根节点的balance=LH
t.balance=RH;
tl.balance=EH;
tlr.balance=EH;
break;
caseEH://情况c:当p的左孩子的右子树根节点的balance=EH
t.balance=EH;
tl.balance=EH;
tlr.balance=EH;
break;
default:
break;}
left_rotate(t.left);
right_rotate(t);
break;

default:
break;}}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: