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

平衡二叉搜索树(AVL)插入和删除的java代码实现

2014-06-17 17:24 411 查看
[align=left] AVL树节点的声明代码:[/align]

[align=left]package geeksgeeks.avl;[/align]

public class TreeNode
{

[align=left] int key ;[/align]
[align=left] TreeNode left ;[/align]
[align=left] TreeNode right ;[/align]
[align=left] int height ;[/align]

public TreeNode( int key, int height)
{
this .key =
key;
this .height =
height;
[align=left] }[/align]
[align=left]}[/align]

[align=left]AVL树的实现代码如下:[/align]

[align=left]package geeksgeeks.avl;[/align]

public class AVLTree
{

[align=left] /*[/align]
[align=left] * 获得某个节点的高度。[/align]
[align=left] * */[/align]
public int getHeight(TreeNode
root){
[align=left] if(root==null) return 0;[/align]
[align=left] return root.height ;[/align]
[align=left] }[/align]
[align=left] /*[/align]
[align=left] * 树的前序遍历[/align]
[align=left] * */[/align]
public void preOrder(TreeNode
root){
[align=left] if(root==null) return;[/align]
System. out.print(root.key +"
" );
[align=left] preOrder(root. left);[/align]
[align=left] preOrder(root. right);[/align]
[align=left] }[/align]
[align=left] /*[/align]
[align=left] * 树的中序遍历[/align]
[align=left] * */[/align]
public void inerOrder(TreeNode
root){
[align=left] if(root==null) return;[/align]
[align=left] inerOrder(root. left);[/align]
System. out.print(root.key +"
" );
[align=left] inerOrder(root. right);[/align]
[align=left] }[/align]
[align=left] /*[/align]
[align=left] * 左旋转[/align]
[align=left] * */[/align]
public TreeNode
LeftRotate(TreeNode root){
[align=left] TreeNode x = root. right;[/align]
[align=left] TreeNode t2 = x. left;[/align]
[align=left] [/align]
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;
[align=left] return x;[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] /*[/align]
[align=left] * 右旋转[/align]
[align=left] * */[/align]
public TreeNode
RightRotate(TreeNode root){
[align=left] TreeNode x = root. left;[/align]
[align=left] TreeNode t2 = x. right;[/align]
[align=left] [/align]
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;
[align=left] return x;[/align]
[align=left] }[/align]
[align=left] /*[/align]
[align=left] * 找到AVL中一个节点右子树中最小的节点[/align]
[align=left] * */[/align]
public TreeNode
getMinNode(TreeNode root){
[align=left] TreeNode newnNode = root. right;[/align]
[align=left] if(newnNode== null) return null;[/align]
[align=left] while(newnNode. left!=null ){[/align]
[align=left] newnNode = newnNode. left;[/align]
[align=left] }[/align]
[align=left] return newnNode;[/align]
[align=left] }[/align]
[align=left] /*[/align]
[align=left] * 往AVL中插入节点的代码[/align]
[align=left] * */[/align]
public TreeNode
InsertAVLTree(TreeNode root,int key){
if(root==null) return new TreeNode(key,
1);
[align=left] if(key<root.key ){[/align]
root. left =
InsertAVLTree(root.left , key);
[align=left] } else if (key>root.key){[/align]
root. right =
InsertAVLTree(root.right , key);
[align=left] }[/align]
root. height =
Math.max(getHeight(root. right),
getHeight(root.left))+1;
int balance
= getHeight(root.left )-getHeight(root.right);
[align=left] if(balance>1&&key<root.left .key ){[/align]
[align=left] return RightRotate(root);[/align]
[align=left] }[/align]
[align=left] if(balance>1&&key>root.left .key ){[/align]
root. left =
LeftRotate(root.left );
[align=left] return RightRotate(root);[/align]
[align=left] }[/align]
[align=left] if(balance<-1&&key>root.right .key ){[/align]
[align=left] return LeftRotate(root);[/align]
[align=left] }[/align]
[align=left] if(balance<-1&&key<root.right .key ){[/align]
root. right =
RightRotate(root.right );
[align=left] return LeftRotate(root);[/align]
[align=left] }[/align]
[align=left] return root;[/align]
[align=left] }[/align]
[align=left] /*[/align]
[align=left] * 在AVL中删除一个节点的代码[/align]
[align=left] * */[/align]
public TreeNode
DeleteAVLTree(TreeNode root, int key,TreeNode
parent){
[align=left] if(root== null) return null;[/align]
[align=left] if(key<root. key){[/align]
root. left =
DeleteAVLTree(root.left , key,root);
[align=left] }else if(key>root.key ){[/align]
root. right =
DeleteAVLTree(root.right , key,root);
[align=left] }else{[/align]
[align=left] if(root.left ==null||root.right==null){[/align]
TreeNode temp = (root. left==null ?
root.right:root.left );
[align=left] if(temp==null){[/align]
[align=left] if(parent.left ==root){[/align]
[align=left] parent. left = null ;[/align]
[align=left] } else{[/align]
[align=left] parent. right = null ;[/align]
[align=left] }[/align]
[align=left] root = null;[/align]
[align=left] } else{[/align]
root. key =
temp.key ;
[align=left] if(root.left ==temp){[/align]
[align=left] root. left=null ;[/align]
[align=left] } else{[/align]
[align=left] root. right = null ;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] } else{[/align]
[align=left] TreeNode minNode = getMinNode(root);[/align]
root. key =
minNode.key ;
root. right =
DeleteAVLTree(root.right , minNode.key,
root);
[align=left] }[/align]
[align=left] }[/align]
[align=left] if(root== null) return null;[/align]
root. height =
Math.max(getHeight(root. left),
getHeight(root.right))+1;
int balance
= getHeight(root. left)-getHeight(root.right );
[align=left] if(balance>1&&getHeight(root. left)>=0){[/align]
[align=left] return RightRotate(root);[/align]
[align=left] }[/align]
[align=left] if(balance>1&&getHeight(root. left)<0){[/align]
root. left =
LeftRotate(root.left );
[align=left] return RightRotate(root);[/align]
[align=left] }[/align]
[align=left] if(balance<-1&&getHeight(root. right)<0){[/align]
[align=left] return LeftRotate(root);[/align]
[align=left] }[/align]
[align=left] if(balance<-1&&getHeight(root)>=0){[/align]
root. right =
RightRotate(root.right );
[align=left] return LeftRotate(root);[/align]
[align=left] }[/align]
[align=left] return root;[/align]
[align=left] }[/align]
[align=left]}[/align]

[align=left]AVL测试代码如下:[/align]

[align=left]package geeksgeeks.avl;[/align]

public class TestAVLTree
{

[align=left] /**[/align]
[align=left] * @param args[/align]
[align=left] */[/align]
public static void main(String[]
args) {
[align=left] AVLTree avl = new AVLTree();[/align]
[align=left] TreeNode root = null ;[/align]
[align=left] root = avl.InsertAVLTree(root, 10);[/align]
[align=left] root = avl.InsertAVLTree(root, 20);[/align]
[align=left] root = avl.InsertAVLTree(root, 30);[/align]
[align=left] root = avl.InsertAVLTree(root, 40);[/align]
[align=left] root = avl.InsertAVLTree(root, 50);[/align]
[align=left] root = avl.InsertAVLTree(root, 25);[/align]
[align=left] avl.preOrder(root);[/align]
[align=left] System. out .println();[/align]
[align=left] avl.inerOrder(root);[/align]
[align=left] System. out .println();[/align]
[align=left] root = avl.DeleteAVLTree(root, 30, null);[/align]
[align=left] avl.preOrder(root);[/align]
[align=left] System. out .println();[/align]
[align=left] avl.inerOrder(root);[/align]
[align=left] root = avl.DeleteAVLTree(root, 50, null);[/align]
[align=left] System. out .println();[/align]
[align=left] avl.preOrder(root);[/align]
[align=left] System. out .println();[/align]
[align=left] avl.inerOrder(root);[/align]
[align=left] }[/align]

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