平衡二叉树(AVL树)

本文介绍了AVL树的概念,平衡因子以及如何通过旋转操作处理不平衡情况。当插入节点导致最小不平衡子树出现时,通过右旋和左旋操作恢复平衡。详细阐述了两种复杂情况的调整方法,并提供了插入节点的实现思路。
摘要由CSDN通过智能技术生成

平衡二叉树

或者是一颗空树,或者它的左右子树都是平衡二叉树,且左子树和右子树的深度之差不超过1 。

BF(Balance Factor)

我们将二叉树上节点的左子树深度减去右子树深度的值成为平衡因子。那么平衡二叉树上所有节点的平衡因子只可能是-1,0,1.只要二叉树上有一个节点的平衡引子的绝对值大于1,则该二叉树就是不平衡的。


距离插入节点最近的,且平衡因子的绝对值大于1的节点为根的子树,我们成为最小不平衡子树最小不平衡子树的树根是我们操作平衡转换的参照点,调整最小不平衡子树,然后就可以达到平衡的效果。


首先要明白,如果需要调整平衡二叉树,那么这颗二叉树肯定是刚刚开始不平衡的,我们只需要调整因为插入新节点导致的最小不平衡子树的结构即可。

树的节点结构,相比于二叉查找树,增加一bf,用来存储平衡因子。

/* 二叉树的二叉链表节点结构定义 */
typedef struct BiTNode
{
	int data;	
	int bf;							/* 相对于二叉查找树,增加了平衡因子bf */
	struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

两个基本操作,左旋和右旋。

右旋图示:


代码如下:

/* 对以p为根的二叉排序树作右旋处理 */
/* 处理之后p指向新的树根节点,即旋转处理之前的左子树的根节点 */
void R_Rotate( BiTree *p )
{
	/*
	  L->rchild (节点2的右孩子) 为NULL          L->rchild != NULL
	  例 :    3                                例 :  9              6 
	    	 /										 / \            / \
	        2    =>    2                            6  10   =>     5   9
	       /          / \                          / \            /   / \
	      1          1   3                        5   7          4   7  10
	                                             /
												4
	*/
	BiTree L;
	L = (*p)->lchild;
	(*p)->lchild = L->rchild;	/* 容易忽视,将*p的左子树的右子树作为*p的左子树(如果 L->rchild 不为空) */
	L->rchild = (*p);
	*p = L;
}


左旋图示:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值