平衡二叉搜索树(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]
[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]
相关文章推荐
- 平衡二叉树平衡二叉树(AVL)--查找、删除、插入(Java实现)
- ibatis 批量插入,批量更新,批量删除,xml与Java代码实现方式
- 平衡二叉树(AVL)--查找、删除、插入(Java实现)
- 平衡二叉树(AVL)的插入、删除、查找的java实现
- 平衡二叉树(AVL)--查找、删除、插入(Java实现)
- 今天学了线性表顺序表示,自己写了一段代码!实现了 插入和删除!这也是第一次写博客
- java实现B树(二叉树)插入,删除
- <java><JTable>使用AbstractTableModel实现更新、删除、插入数据
- java 实现二叉查找树的 插入、删除、查找、深搜和广搜
- 二叉平衡树AVL的插入和删除的C实现源码
- 用JAVA语言,编写一个链表类(双向链表),实现插入,删除,查找操作
- 删除JAVA集合中元素的实现代码
- 二叉查找树--查找、删除、插入(Java实现)
- [编写高质量代码:改善java程序的151个建议]建议68 频繁插入和删除时使用LinkedList
- java实现B树(二叉树)插入,删除
- 提高你的Java代码质量吧:频繁插入和删除时使用LinkedList
- java实现hbase表创建、数据插入、删除表
- java动态代理类,测试,实现AOP,在执行target回调方法前后插入相关代码处理
- java实现hbase表创建、数据插入、删除表
- 数据库的插入、修改、删除操作(java实现)