平衡二叉树

平衡二叉树是二叉排序树的一种优化形式,确保查找、插入和删除操作的时间复杂度为O(logn)。它通过限制左右子树高度差不超过1来保持平衡。在插入新结点后,如果发现最小不平衡子树,会通过旋转操作重新调整结构以恢复平衡。主要分为两种旋转:BF大于1时右旋,小于-1时左旋;若子树BF符号相反,则需要两次旋转来完成平衡操作。

为什么需要平衡二叉树?不平衡的二叉排序树的查找效率是非常低的,不平衡的最坏情况就是斜树,查找的时间复杂度是O(n),等同于顺序查找。因此我们在构建时就让这棵二叉排序树是平衡二叉树,此时的查找时间复杂度是O(logn),插入和删除也为O(logn),这显然是一种比较理想的动态查找表算法。


平衡二叉树:是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1。它是一种高度平衡的二叉树。

平衡因子:将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF(Balance Factor)。

最小不平衡子树:距离插入结点最近,且平衡因子的绝对值大于1的结点为根的子树,我们称为最小不平衡子树。


平衡二叉树构建的基本思想就是在构建二叉排序树的过程中,每当插入一个结点时,先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树。在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。

1、当最小不平衡子树根结点的平衡因子BF是大于1时,就右旋;小于-1时就左旋。

2、插入结点后,最小不平衡子树的BF与它的子树的BF符合相反时,就需要对结点先进行一次旋转使得符号相同后,再反向旋转一次才能够完成平衡操作。


#define EH 0
#define LH +1
#define RH -1

typedef struct BiTNode
{
	int data;
	int bf;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

void R_Rotate(BiTree *P)
{
	BiTree L;
	L = (*P)->lchild;
	(*P)->lchild = L->rchild;
	L->rchild = (*P);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值