平衡二叉搜索树(AVL树)及其实现

AVL树:

  • AVL树是良好平衡的,在一颗AVL树中,每个结点的子树的高度差距为0或者1。可以得出一个AVL树的最大高度为O(log n)。

  • 平衡因子:右子树的高度减去左子树的高度。

  • 左偏重:如果结点的平衡因子为-1 或更小。

  • 右偏重:如果结点的平衡因子为+1 或更大。

  • 旋转:一个结点重新获得平衡的过程,有4 种可能的旋转:LL、RR、LR、RL。

  • LL旋转:以下情况使用LL旋转
    LL旋转

  • RR旋转:以下情况使用RR旋转
    RR旋转

  • LR旋转:以下情况使用LR旋转
    LR旋转

  • RL旋转:以下情况使用RL旋转
    RL旋转

AVL是二叉搜索树,将AVLTree设计为BST的子类:

  • 旋转的实现
    -LL旋转算法:
private void balanceLL(TreeNode<E> A, TreeNode parentOfA) {
   
        TreeNode<E> B = A.left;

        if (A == root) {
   
            root = B;
        }
        else {
   
            if (parentOfA.left == A) {
   
                parentOfA.left = B;
            }
            else {
   
                parentOfA.right = B;
            }
        }

        A.left = B.right;
        B.right = A;
        updateHeight((AVLTreeNode<E>)A);
        updateHeight((AVLTreeNode<E>)B);
    }

-RR旋转算法:

private void balanceRR(TreeNode<E> A, TreeNode parentOfA) {
   
        TreeNode<E> B = A.left;

        if (A == root) {
   
            root = B;
        }
        else {
   
            if (parentOfA.left == A) {
   
                parentOfA.left = B;
            }
            else {
   
                parentOfA.right = B;
            }
        }

        A.right = B.left;
        B.right = A;
        updateHeight((AVLTreeNode<E>)A);
        updateHeight((AVLTreeNode<E>)B);

    }

-LR旋转算法:

private void balanceLR(TreeNode<E> A, TreeNode parentOfA) {
   
        TreeNode<E> B = A.left;
        TreeNode<E> C = B.right;

        if (A == root) {
   
            root = C;
        }
        else {
   
            if (parentOfA.left == A) {
   
                parentOfA.left = C;
            }
            else {
   
                parentOfA.right = C;
            }
        }

        A.left = C.right;
        B.right = C.left;
        C.left = B;
        C.right = A;
        updateHeight((AVLTreeNode<E>)A);
        updateHeight((AVLTreeNode<E>)B);
        updateHeight((AVLTreeNode<E>)C);
    }

-RL旋转算法:

private void balanceRL(TreeNode<E> A, TreeNode parentOfA) {
   
        TreeNode<E> B = A.right;
        TreeNode<E> C = B.left;

        if (A == root) {
   
            root = C;
        }
        else {
   
            if (parentOfA.left == A) 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值