AVL树节点的声明代码:
package
geeksgeeks.avl;
public
class
TreeNode {
int
key
;
TreeNode
left
;
TreeNode
right
;
int
height
;
public
TreeNode(
int
key,
int
height) {
this
.
key
= key;
this
.
height
= height;
}
}
AVL树的实现代码如下:
package
geeksgeeks.avl;
public
class
AVLTree {
/*
* 获得某个节点的高度。
* */
public
int
getHeight(TreeNode root){
if
(root==
null
)
return
0;
return
root.
height
;
}
/*
* 树的前序遍历
* */
public
void
preOrder(TreeNode root){
if
(root==
null
)
return
;
System.
out
.print(root.
key
+
" "
);
preOrder(root.
left
);
preOrder(root.
right
);
}
/*
* 树的中序遍历
* */
public
void
inerOrder(TreeNode root){
if
(root==
null
)
return
;
inerOrder(root.
left
);
System.
out
.print(root.
key
+
" "
);
inerOrder(root.
right
);
}
/*
* 左旋转
* */
public
TreeNode LeftRotate(TreeNode root){
TreeNode x = root.
right
;
TreeNode t2 = x.
left
;
x.
left
= root;
root.
right
= t2;
root.
height
= Math.max(getHeight(root.
left
), getHeight(root.
right
))+1;
x.
height
= Math.max(getHeight(x.
left
), getHeight(x.
right
))+1;
return
x;
}
/*
* 右旋转
* */
public
TreeNode RightRotate(TreeNode root){
TreeNode x = root.
left
;
TreeNode t2 = x.
right
;
x.
right
= root;
root.
left
= t2;
root.
height
= Math.max(getHeight(root.
left
), getHeight(root.
right
))+1;
x.
height
= Math.max(getHeight(x.
right
), getHeight(x.
left
))+1;
return
x;
}
/*
* 找到AVL中一个节点右子树中最小的节点
* */
public
TreeNode getMinNode(TreeNode root){
TreeNode newnNode = root.
right
;
if
(newnNode==
null
)
return
null
;
while
(newnNode.
left
!=
null
){
newnNode = newnNode.
left
;
}
return
newnNode;
}
/*
* 往AVL中插入节点的代码
* */
public
TreeNode InsertAVLTree(TreeNode root,
int
key){
if
(root==
null
)
return
new
TreeNode(key, 1);
if
(key<root.
key
){
root.
left
= InsertAVLTree(root.
left
, key);
}
else
if
(key>root.
key
){
root.
right
= InsertAVLTree(root.
right
, key);
}
root.
height
= Math.max(getHeight(root.
right
), getHeight(root.
left
))+1;
int
balance = getHeight(root.
left
)-getHeight(root.
right
);
if
(balance>1&&key<root.
left
.
key
){
return
RightRotate(root);
}
if
(balance>1&&key>root.
left
.
key
){
root.
left
= LeftRotate(root.
left
);
return
RightRotate(root);
}
if
(balance<-1&&key>root.
right
.
key
){
return
LeftRotate(root);
}
if
(balance<-1&&key<root.
right
.
key
){
root.
right
= RightRotate(root.
right
);
return
LeftRotate(root);
}
return
root;
}
/*
* 在AVL中删除一个节点的代码
* */
public
TreeNode DeleteAVLTree(TreeNode root,
int
key,TreeNode parent){
if
(root==
null
)
return
null
;
if
(key<root.
key
){
root.
left
= DeleteAVLTree(root.
left
, key,root);
}
else
if
(key>root.
key
){
root.
right
= DeleteAVLTree(root.
right
, key,root);
}
else
{
if
(root.
left
==
null
||root.
right
==
null
){
TreeNode temp = (root.
left
==
null
? root.
right
:root.
left
);
if
(temp==
null
){
if
(parent.
left
==root){
parent.
left
=
null
;
}
else
{
parent.
right
=
null
;
}
root =
null
;
}
else
{
root.
key
= temp.
key
;
if
(root.
left
==temp){
root.
left
=
null
;
}
else
{
root.
right
=
null
;
}
}
}
else
{
TreeNode minNode = getMinNode(root);
root.
key
= minNode.
key
;
root.
right
= DeleteAVLTree(root.
right
, minNode.
key
, root);
}
}
if
(root==
null
)
return
null
;
root.
height
= Math.max(getHeight(root.
left
), getHeight(root.
right
))+1;
int
balance = getHeight(root.
left
)-getHeight(root.
right
);
if
(balance>1&&getHeight(root.
left
)>=0){
return
RightRotate(root);
}
if
(balance>1&&getHeight(root.
left
)<0){
root.
left
= LeftRotate(root.
left
);
return
RightRotate(root);
}
if
(balance<-1&&getHeight(root.
right
)<0){
return
LeftRotate(root);
}
if
(balance<-1&&getHeight(root)>=0){
root.
right
= RightRotate(root.
right
);
return
LeftRotate(root);
}
return
root;
}
}
AVL测试代码如下:
package
geeksgeeks.avl;
public
class
TestAVLTree {
/**
*
@param
args
*/
public
static
void
main(String[] args) {
AVLTree avl =
new
AVLTree();
TreeNode root =
null
;
root = avl.InsertAVLTree(root, 10);
root = avl.InsertAVLTree(root, 20);
root = avl.InsertAVLTree(root, 30);
root = avl.InsertAVLTree(root, 40);
root = avl.InsertAVLTree(root, 50);
root = avl.InsertAVLTree(root, 25);
avl.preOrder(root);
System.
out
.println();
avl.inerOrder(root);
System.
out
.println();
root = avl.DeleteAVLTree(root, 30,
null
);
avl.preOrder(root);
System.
out
.println();
avl.inerOrder(root);
root = avl.DeleteAVLTree(root, 50,
null
);
System.
out
.println();
avl.preOrder(root);
System.
out
.println();
avl.inerOrder(root);
}
}