平衡二叉树(AVL)的左旋转右旋转和双旋转

本文深入探讨了平衡二叉树的原理与应用,包括平衡二叉树的定义、特点及其实现方法,如红黑树、AVL树等。详细解释了平衡二叉树的左旋转、右旋转和双旋转操作,以及如何通过这些操作保持树的平衡状态,确保高效的数据查询和处理。

平衡二叉树的介绍

首先,咱们先来说一下为什么要提出平衡二叉树的概念,如果一个二叉排序树是一个只有左子树或者右子树的二叉排序树的时候,其实它就相当于一个链表,但是他的查询,删除,遍历的速度却没有链表快。这是为什么呢。因为在每次查询,删除,遍历的时候,要去判断他的左节点或者右节点是否为null,所以浪费了时间。所以我们提出平衡二叉树的概念

基本介绍

1)平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为 AVL 树,可以保证查询效率较高。

2)具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵

平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树,Treap、伸展树等。

平衡二叉树的左旋转和右旋转

当根节点左右子树高度的差值大于1了怎么办呢,这时候我们就需要对二叉树进行左右旋转,那么什么时候应该左旋转,什么时候应该右旋转呢

当左子树的高度-右子树的高度>1的时候就应该右旋转,反而言之,当右子树的高度-左子树的高度>1的时候就应该左旋转

那么怎么旋转呢?

假如以这个数列为例{4,3,6,5,7,8}

思路分析(示意图)

咱们先将数组构成一个二叉排序树然后进行下列操作:

在这里插入图片描述

//左旋转方法
private void leftRotate() {
//创建新的结点,以当前根结点的值
Node newNode = new Node(value);
//把新的结点的左子树设置成当前结点的左子树
newNode.left = left;
//把新的结点的右子树设置成带你过去结点的右子树的左子树
newNode.right = right.left;
//把当前结点的值替换成右子结点的值
value = right.value;
//把当前结点的右子树设置成当前结点右子树的右子树
right = right.right;
//把当前结点的左子树(左子结点)设置成新的结点
left = newNode;
}

说完左旋转咱们说右旋转

例如这个数列 {10,12, 8, 9, 7, 6}转成平衡二叉树

思路分析(示意图)

在这里插入图片描述

//右旋转
private void rightRotate() {
Node newNode = new Node(value);
newNode.right = right;
newNode.left = left.right;
value = left.value;
left = left.left;
right = newNode;
}

双旋转

凡事也有例外,有些时候,光靠左旋转或者右旋转并不能将一棵树转化成平衡二叉树,这个时候我们就得用到双旋转

什么时候要用双旋转呢,在符合右旋转的条件后,如果它的左子树的右子树高度大于它的左子树的高度,则先对当前这个结点的左节点进行左旋转,在对当前结点进行右旋转的操作即可

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值