平衡二叉树的调整

平衡二叉树都通过旋转来调整

LL型

造成不平衡的结点在从上往下第一个不平衡结点的左子树的左子树上
在这里插入图片描述

typedef struct AVLNode *AVLTree;
typedef int ElementType;
struct AVLNode{
    ElementType data;
    AVLTree left; 
    AVLTree right;  
    int height;
};

int GetHeight(AVLTree bt)
{
	if(bt)
		return max(GetHeight(bt->left),GetHeight(bt->right))+1;
	return 0;
}

AVLTree LeftRotation(AVLTree a)
{
	AVLTree b=a->left;
	a->left=b->right;
	b->right=a;
	a->height=max(GetHeight(a->left),GetHeight(a->right))+1;
	b->height=max(GetHeight(b->left),a->height)+1;
	return b;
}

注意!!!调整高度时,不能直接是左子树高度和右子树高度中的最大值加1,因为可能子树为空树,其没有高度这个变量,会发生错误。可能有左空,右空,都空,好麻烦。可以定义一个GetHeight函数求树高,对空树也处理

RR型

造成不平衡的结点在从上往下第一个不平衡结点的右子树的右子树上
在这里插入图片描述

AVLTree RightRotation(AVLTree a)
{
	AVLTree b=a->right;
	a->right=b->left;
	b->left=a;
	a->height=max(GetHeight(a->left),GetHeight(a->right))+1;
	b->height=max(a->height,GetHeight(b->right))+1;
	return b;
}

LR型

造成不平衡的结点在从上往下第一个不平衡结点的左子树的右子树上
在这里插入图片描述

AVLTree LeftRightRotation(AVLTree a)
{
	a->left=RightRotation(a->left);
	return LeftRotation(a);
}

RL型

造成不平衡的结点在从上往下第一个不平衡结点的右子树的左子树上
在这里插入图片描述

AVLTree RightLeftRotation(AVLTree a)
{
	a->right=LeftRotation(a->right);
	return RightRotation(a);
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值