平衡二叉树的旋转

平衡二叉树的旋转

在一棵平衡二叉树增加或删除结点的时候,可能会破坏原本的平衡状态,在此时需要对被破坏平衡的结点进行处理,使其恢复到平衡状态,即旋转。
有四种不同的不平衡状态:LL型、RR型、LR型、RL型

LL型

在这里插入图片描述在这里插入图片描述
此时的树是左孩子深度大于右孩子,即左子树较深,所以需进行右旋
根据二叉搜索树的性质(左孩子<根结点<右孩子):
若将a2上升到根结点,则a2的子树要归并到右子树,
而a2的右子树又小于根结点a1,则需将a2右子树归并为a1的左子树
然后将a1作为a2右子树

旋转步骤:
①将a2的右孩子存储为a1的左孩子
②将a1作为a2的右孩子,把a2作为根

/**
  * LL型进行右旋
  * @param rootNode 破坏结点
  * @return 平衡后的破坏结点
  */
 public static TreeNode LLSpin(TreeNode rootNode) {
  	//先对破坏结点左孩子进行存储
  	TreeNode midNode = rootNode.getLeChild();
  	//将存储结点的右结点赋给破坏结点的左结点
 	rootNode.setLeChild(midNode.getRiChild());
  	//将破坏结点置于存储结点的右结点处
  	midNode.setRiChild(rootNode);
  	//返回新结点,用以将破坏结点父结点处的引用做修改
  	return midNode;
 }
RR型

RR型的旋转步骤同于LL型,不过是进行左旋

/**
  *  RR型进行左旋
  * @param rootNode 破坏结点
  * @return 平衡后的破坏结点
  */
 public static TreeNode RRSpin(TreeNode rootNode) {
  	//先对破坏结点右孩子进行存储
  	TreeNode midNode = rootNode.getRiChild();
  	//将存储结点的左结点赋给破坏结点的右结点
  	rootNode.setRiChild(midNode.getLeChild());
  	//将破坏结点置于存储结点的左结点处
  	midNode.setLeChild(rootNode);
  	//将破坏结点父结点处的引用做修改
  	return midNode;
 }
LR型

在这里插入图片描述
在这里插入图片描述
LR型的树无法在进行一次旋转后就达到平衡。
此时则需先对不平衡结点的左孩子进行一次左旋,
然后对根结点进行一次右旋

/**
  * LR型先左旋后右旋
  * @param rootNode
  * @return 平衡后的破坏结点
  */
 public static TreeNode LRSpin(TreeNode rootNode) {
  	//先对破坏结点的左孩子进行左旋
  	rootNode.setLeChild(RRSpin(rootNode.getLeChild()));
  
  	//再对破坏结点进行右旋
  	return LLSpin(rootNode);
 }

RL型

RL型同LR型,方向相反

/**
  * RL型先右旋后左旋
  * @param rootNode
  * @return 平衡后的破坏结点
  */
 public static TreeNode RLSpin(TreeNode rootNode) {
  //先对破坏结点的右孩子进行右旋
  rootNode.setRiChild(LLSpin(rootNode.getRiChild()));;
  
  //再对破坏结点进行左旋
  return RRSpin(rootNode);
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值