最新问AVL为何物,我愿称之为转转转_为什么avl树称为旋转,2024年最新如何化身BAT面试收割机

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

AVL树的创建思路与算法步骤🐼

  • 左旋思想与步骤
    • 创建一个新的节点,其权值等于原根节点的权值
    • 新节点的左子树等于原根节点的左子树
    • 新节点的右子树等于原根结点的右子树的左子树
    • 原根节点的权值等于其右子节点的权值
    • 原根结点的右子树等于其右子树的右子树
    • 原根结点的左子节点等于新节点
  • 右旋思想与步骤
    • 创建一个新的节点,其权值等于原根节点的权值
    • 新节点的右子树等于原根结点的右子树
    • 新节点的左子树等于原根结点的左子树的右子树
    • 原根结点的权值等于其左子节点的权值
    • 原根结点的左子树等于其左子树的左子树
    • 原根结点的右子节点等于新节点
图解😶‍🌫️:

右旋


代码实现与分析🐼

节点类中🦁

1.右旋的核心代码🐻

public void rightRotation() {
        var newNode = new Node(value);
        newNode.right = right;
        newNode.left = left.right;
        value = left.value;
        left = left.left;
        right = newNode;
    }
代码分析🐨:

略,按照算法步骤即可

2.左旋的核心代码🐻

    public void leftRotation() {
        var newNode = new Node(value);
        newNode.left = left;
        newNode.right = right.left;
        value = right.value;
        right = right.right;
        left = newNode;
    }
代码分析🐨:

略,根据算法步骤即可

3.判断树高的核心代码(最难)🐻

public int height() {
        return Math.max(left != null ? left.height() : 0,right != null ? right.height() : 0) + 1;
    }
代码分析🐨:
  1. 这里主要运用的思想是递归与回溯思想,利用递归,底层创建了许多的Math.max()
  2. 又根据谁调用,返回值给谁的原则,成就了该方法
  3. 以下是图解:

4.建立左高与右高的方法🐻

    public int leftHeight() {
        if (left == null) {
            return 0;
        }
        return left.leftHeight();
    }

    public int rightHeight() {
        if (right == null) {
            return 0;
        }
        return right.rightHeight();
    }
代码分析🐨:
  • 最重要的就是校验是否为空,其他直接调取即可

5,创建一个添加节点的方法🐻

public void add(Node node) {
        if (node == null) {
            return;
        }
        if (node.value >= value) {
            if (right != null) {
                right.add(node);
            }else {
                right = node;
            }
        }else {
            if (left != null) {
                left.add(node);
            }else {
                left = node;
            }
        }
        if (rightHeight() - leftHeight() > 1) {
            if (right != null && right.leftHeight() > right.rightHeight()) {
                right.rightRotation();
            }
            leftRotation();
        }else if (leftHeight() > rightHeight()) {
            if (left != null && left.rightHeight() > left.leftHeight()) {
                left.leftRotation();
            }
            rightRotation();
        }
    }
代码分析🐨:
  • 主要对左旋右旋操作进行讲解,前面的在BST处有详细讲解
  • 如果右子树高度与左子树高度差值大于一,说明要进行左旋操作
    • 当右子树不为空时,且右子树的左子树高度比右子树的右子树高度大,我们先要对右子树进行右旋,再进行左旋
  • 如果左子树高度与右子树高度差值大于一,说明要进行右旋操作
    • 当左子树不为空,且左子树的右子树高度比左子树的左子树高度大,我们先要对左子树进行左旋,再进行右旋

原因图解😶‍🌫️**😗*

未双旋转的结果

双旋转后的结果

AVL树类中🦁

6.对底层节点的方法调用即可🐻

public class AVLTree {
    public Node root;
    public int height(Node node) {
        if (node == null) {
            return 0;
        }
        return node.height();
    }

    public void add(Node node) {
        if (root == null) {
            root = node;
        }else {
            root.add(node);
        }
    }

代码分析🐨:


结论🐼

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

148)]
[外链图片转存中…(img-h2astd3j-1715881639148)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值