AVL平衡二叉树

平衡二叉树详解
本文深入探讨了平衡二叉树的实现原理,包括左旋、右旋操作,以及如何通过这些操作保持树的平衡,避免树退化为链表,确保高效的数据查找。通过具体的代码示例,详细解析了高度计算方法和节点插入后的平衡调整策略。

二叉排序树

二叉排序树的升级版之平衡二叉树

//右高度大于左高度时,旋转一次,右边的每个节点向上移一层
public void LeftRotate(){
        node TempRoot = new node(value);
           TempRoot.left=left;
           TempRoot.right=right.left;
          // right.left=TempRoot; 本意是想将当前节点(this)的右节点设置为根节点,但这并不能成功,容易混乱
             value=right.value;  //通过改变内容来实现转换更好
        left=TempRoot;  //设置新节点的左节点
        right=right.right;
    }
    
    public void RightRotate(){
        node temp = new node(value);
        temp.right=right;
        temp.left=left.right;
        value=left.value;
        left=left.left;
        right=temp;
    }
    public int Lheight(){  //想清楚知道当前左子节点的高度时,而非当前节点的高度
        if (left!=null){
           return left.Height();
        }else{
            return 0;
        }
    }
    public int Rheight(){
        if (right!=null){
            return right.Height();
        }else {
            return 0;
        }
    }
    //计算高度的绝妙方法,暂时还没领悟
    
    public int Height(){
        return Math.max(left==null?0:left.Height(), right==null?0:right.Height())+1;   //绝了,想不到
    }
    //不同于二叉排序树的关键代码
public void add(node Node){
        if (Node==null){
            return;
        }
        if (Node.value<this.value){   //当前调用这个add函数的节点就是this
            if (this.left==null){
                this.left=Node;
            }else {
                this.left.add(Node);
            }
        }else {
            if (this.right==null){
                this.right=Node;
            }else {
                this.right.add(Node);
            }
        }
        //从这里开始不同于二叉排序树
        if (Rheight()-Lheight()>1){    //由于每次都是从根节点开始查找(root.add()),所以插入后会自动以根节点的左右高度分析
            if (right!=null&&right.Lheight()>right.Rheight()) //双旋转特殊情况,结合左,右旋的代码分析
            {
                right.RightRotate();
            }
            LeftRotate();
        }
        if (Lheight()-Rheight()>1){
            if (left.Rheight()>left.Lheight()){
                left.LeftRotate();
            }
            RightRotate();
        }
    }

需要双旋转的特殊情况图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值