平衡二叉树(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;}}
相关文章推荐
- html制作简单框架网页二 实现自己的影音驿站 操作步骤及源文件下载 (可播放mp4、avi、mpg、asx、swf各种文件的视频播放代码)
- SBTree的左旋右旋以及各种调整操作的基本实现(包含查找第k大的数值)
- 平衡二叉树创建,左旋,右旋,左平衡和右平衡
- AVL树 封装左旋 右旋操作
- 自平衡二叉查找树(一)-----------AVL树分析和代码实现
- Java中使用Jedis操作Redis的实现代码
- Linux中在主机上实现对备机上文件夹及文件的操作的C代码实现
- 一行代码实现FMDB的CURD操作
- jQuery点击后一组图片左右滑动的实现代码
- 数据库SqlParameter 的插入操作,防止sql注入的实现代码
- android操作SQLite增删改减实现代码
- Java语言实现对MySql数据库中数据的增删改查操作的代码
- JS Excel读取和写入操作(模板操作)实现代码
- 数据结构——AVL树(平衡二叉树)的详细实现
- 实现磁盘满额自动邮件报警的具体思路及操作步骤
- jQuery操作 input type=checkbox的实现代码
- 算法学习 - 平衡二叉查找树实现(AVL树)
- 利用jQuery简单实现产品展示图片左右滚动功能(示例代码)