平衡二叉树(AVL树)

平衡二叉树(AVL树)

1、为什么要平衡二叉树

如果由数组{1, 2, 3, 4, 5}来构建一颗二叉排序树,得到的二叉树不仅没有体现其特点,反而还退化成了链表,且因为要判断左子树,查询效率比链表还低

2、平衡二叉树的介绍

  • 平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树,可以保证查询效率较高
  • 具有以下特点:
    • 它是一棵空树它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树
    • 平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等

3、平衡二叉树的应用

3.1、左旋转

3.1.1、应用场景

右子树的高度高于左子树,且差值大于1,所以需要进行左旋转,来降低右子树的高度

3.1.2、思路分析
  1. 创建一个newRoot新节点,值为当前节点root的值
  2. 让新节点的左子树newRoot.left指向当前节点root.left的左子树
  3. 让新节点的右子树newRoot.right指向当前节点的右子树的左子树root.right.left
  4. 将当前节点的值root.value改为其右子树的值root.right.value
  5. 将当前节点的右子树变为其右子树的右子树root.right = root.right.right
  6. 让当前节点的左子树指向新节点root.left = newRoot
3.1.3、代码实现

注意:

在获取树的高度的时候,精髓在最后面的+1,只要left或者right有值,就将要返回的值+1,然后做递归
当左边的节点为null了,左边的递归就结束了,右边同理

//核心代码
public void leftRotate() {
   
        Node newRoot = new Node(root.value);
        newRoot.left = root.left;
        newRoot.right = root.right.left;
        root.value = root.right.value;
        root.right = root.right.right;
        root.left = newRoot;
    }

		//取当前节点树的高度
    public int getHeight() {
   
        //精髓在最后面的+1,只要left或者right有值,就将要返回的值+1,然后做递归
        //当左边的节点为null了,左边的递归就结束了,右边同理
        return Math.max(left == null ? 0 : left.getHeight(), right == null ? 0 : right.getHeight()) + 1;
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值