AVL树的插入

5 篇文章 0 订阅
2 篇文章 0 订阅

介绍: 在二叉搜索树的前提下,左右高度差(平衡因子)的绝对值不大于1

二叉搜索数->中序排序树->极端情况下时间复杂度高 ->我博客更过不了解去翻翻

(搜索二叉树——寻找节点,插入节点,删除节点_别想闲鱼了!快去学习的博客-CSDN博客)

平衡因子=右树高度-左树高度

写一下AVL的插入操作

首先就是 插入新的数 -> 流程就是二叉搜索数插入方式

 // 像搜索二叉树的操作插入
        TreeNode node = new TreeNode(val);
        if(root==null){
            root = node;
            return true;
        }

        TreeNode parent =  null;
        TreeNode cur = root;
        while (cur!=null){
            if(cur.val > val){
                parent = cur;
                cur = cur.left;
            } else if(cur.val == val){
                return false;
            } else {
                parent = cur;
                cur = cur.right;
            }
        }
        if(parent.val>val){
            parent.left = node;
        } else {
            parent.right = node;
        }
        node.parent = parent;
        cur = node;

调节一下平衡因子

 // 调节平衡因子
        while (parent != null){
            // 检查左右
            if(cur == parent.right){
                parent.bf++;
            }else {
                parent.bf--;
            }
            // 检查平衡因子
            if(parent.bf==0){
                // 平衡
                break;
            } else if(parent.bf==1 || parent.bf==-1){
                // 继续向上修改
                cur = parent;
                parent = cur.parent;
            } else {
                // 不是高度差绝对值小于1了 进行调整
                if(parent.bf==2){
                    if(cur.bf==1){
                        // 左旋
                        rotateLeft(parent);
                    } else{
                        // cur.bf==-1
                        rotateRL(parent);
                    }
                } else {
                    if(cur.bf==-1){
                        // 右旋
                        rotateRight(parent);
                    } else{
                        // cur.bf==1
                        rotateLR(parent);
                    }
                }
                break;
            }
        }

okk重点操作 左旋情况 

parent.bf==2
cur.bf==1

private void rotateLeft(TreeNode parent) {
        TreeNode subR = parent.right;
        TreeNode subRL = subR.left;
        subR.left = parent;
        parent.right = subRL;
        if(subRL != null){
            subRL.parent = parent;
        }
        TreeNode pParent = parent.parent;
        parent.parent = subR;
        if(parent==root){      
            root = subR;
            root.parent = null;
        } else {
            if(pParent.left==parent){
                pParent.left = subR;
            } else {
                pParent.right = subR;
            }
            subR.parent = pParent;
        }


        subR.bf = 0;
        parent.bf = 0;

    }

当然右旋也同理可得~~~

我们再来看 左右旋

parent.bf==-2
cur.bf==1

 所以可以看出 平衡因子修改还要有限制条件~~~(subLR)

private void rotateLR(TreeNode parent) {
        TreeNode subL = parent.left;
        TreeNode subLR = subL.right;
        int bf = subLR.bf;

        rotateLeft(parent.left);
        rotateRight(parent);

        if(bf==1){
            subL.bf = -1;
            parent.bf = 0;
            subLR.bf = 0;
        }else if(bf==-1){
            subL.bf = 0;
            parent.bf = 1;
            subLR.bf = 0;
        }

    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值