JAVA数据结构与算法 11(5)树-平衡二叉树介绍、动画解析 平衡二叉树的构建操作、右旋转、左旋转、双旋转

本文介绍了平衡二叉树的概念,特点以及在构建过程中如何处理高度不平衡的情况,包括左旋转、右旋转和双旋转的操作,旨在提高查询效率。
摘要由CSDN通过智能技术生成

JAVA数据结构与算法 11.树

4 平衡二叉树

4.1 平衡二叉树介绍

​ 平衡二叉树也叫平衡二叉搜索树,又被称为AVL树,可以保证查询效率较高。具有以下的特点:在二叉排序树的基础上,它是一颗空树或它的左右两颗子树的高度差绝对值不超过1,并且左右两个子树都是一颗平衡二叉树

问题1:如何构建一颗平衡二叉树?

​ 在构建二叉排序树的时候,每添加一个结点,判断根结点的左右子树的高度差,若大于1,则需要进行相应的处理。

问题2:处理分为哪几种情况,每种情况需要做什么处理?

​ 当当前结点右子树的高度-左子树的高度>1时。此时需要减少右子树的高度,执行左旋转操作

​ 当左子树的高度-右子树的高度>1时,此时需要减少左子树的高度,执行右旋转操作

4.2 平衡二叉树的构建操作

4.2.1 左旋转

​ 当当前结点右子树的高度-左子树的高度>1时。此时需要减少右子树的高度,执行左旋转操作

图解

在这里插入图片描述
在这里插入图片描述

原理分析:所谓左旋,就是先将当前结点 T 的右子结点 R 作为新的根结点并指向 T (此时T成为了R的新左子树),再将当前结点 T 的左子树设置为原右子树 R 的左子树 Y。此时左旋结束。

代码思路分析

  1. 创建一个新的结点newNode,值等于当前左旋的二叉树根结点的值 T.value;
  2. 将新结点 newNode的左子树设置为 T 的 左子树,将newNode的右子树设置为 T 结点 右子树 R 的左子结点 Y ;
  3. 将当前结点 T 的值换位右子结点 R 的值,并将结点T的右指针,指向当前右子树R的右子树Z;
  4. 将当前结点T的左指针指向新创建结点newNode;

代码实现

/**
     * 对当前结点进行左旋
     */
    public void leftRotate(){
   
        //此时this 就是 T
        //1.创建一个新的结点newNode,值等于当前左旋的二叉树根结点的值 T.value,
        Node newNode = new Node(this.value);
        //2.将新结点 newNode的左子树设置为 T 的 左子树,将newNode的右子树设置为 T 结点 右子树 R 的左子结点 Y
        newNode.left = this.left;
        newNode.right = this.right.left;
        //3.将当前结点 T 的值换位右子结点 R 的值,并将结点T的右指针,指向当前右子树R的右子树Z
        this.value = this.right.value;
        this.right = this.right.right;
        //4.将当前结点T的左指针指向新创建结点newNode
        this.left = newNode;
    }
4.2.2 右旋转

​ 当左子树的高度-右子树的高度>1时,此时需要减少左子树的高度,执行右旋转操作

图解

在这里插入图片描述

在这里插入图片描述

原理分析:所谓右旋,就是先将当前结点 T 的左子结点 L 作为新的根结点并指向 T (此时T成为了L的新右子树),再将当前结点 T 的右子树设置为原左子树 L 的右子树 Y。此时右旋结束。

代码思路分析:实现思路与左旋相同,左右方位相反

代码实现

public void rightRotate(){
   
        //1.创建一个新的结点newNode,值等于当前右旋的二叉树根结点的值 T.value,
        Node newNode = new Node(this.value);
        //2.将新结点 newNode的右子树设置为 T 的 右子树,将newNode的左子树设置为 T 结点 左子树 L 的右子结点 Y
        newNode.right = this.right;
        newNode.left = this.left.right;
        //3.将当前结点 T 的值换位左子结点 L 的值,并将结点T的左指针,指向当前右子树L的右子树X
        this.value = this.left.value;
        this.left = this.left.left;
        //4.将当前结点T的右指针指向新创建结点newNode
        this
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值