AVL平衡二叉树

本文详细介绍了AVL平衡二叉树的概念,包括其定义、节点结构以及四种旋转类型:右旋LL、左旋RR、先左旋再右旋LR、先右旋再左旋RL。在插入和删除节点后,通过判断旋转操作来维持树的平衡,确保查找、插入、删除操作的最坏情况时间为O(log n)。文章提供了插入和删除操作的递归实现思路,并给出了具体的旋转示例。
摘要由CSDN通过智能技术生成

平衡二叉树定义

AVL树也就是所谓的平衡二叉树,查找、删除、插入最坏情况下为O(log n),维持树的平衡只需要几次旋转即可。保证任意一个节点的左子树高度与右子树高度相差不大于1,默认树为空时高度为0。

节点结构

为了后续操作简洁性,先给出节点结构

final class node{
	int value=0;//键值
	int height=1;//节点高度
	node left=null;//左右孩子
	node right=null;
	node(int value){
		this.value=value;
	}
}

旋转类型

维持平衡的操作就是树的旋转,旋转类型可以分为四种:

1.右旋LL类型




单个右旋,将k1的右子树作为k2的左子树,k2作为k1的右子树。该操作只是对于k1,k2进行,所以X,Y,X子树的高度不变,在旋转完成后,只需更新k1,k2高度即可

node l_l_rotate(node root){//LL旋转
		node temp=root.left;//将左节点拿出来
		root.left=temp.right;
		temp.right=root;
		root.height=Math.max(get_height(root.left),get_height(root.right))+1;//更新原root的height
		root=temp;
		root.height=Math.max(get_height(root.left),get_height(root.right))+1;//更新新root的height
		return root;
	}

简单说就是,将节点的左节点的右子树作为节点的左子树,节点作为其原来左节点的右子树。

2.左旋RR性




跟右转刚好反过来,k2的左子树作为k1的右子树,k1作为k2的左子树。跟上面一样,更改完成后,更新k1,k2的高度即可

node r_r_rotate(node root){//RR旋转
		node temp=root.right;//将右节点拿出来
		root.right=temp.left;
		temp.left=root;
		root.height=Math.max(get_height(root.left),get_height(root.right))+1;//更新原root的height
		root=temp;
		root.height=Math.max(get_height(root.left),get_height(root.right))+1;//更新新root的height
		return root;
	}

节点的右节点的左子树作为节点的右子树,节点作为其原来右节点的左子树。

3.先左旋再右旋LR


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值