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

 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);
      }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值