在前一篇文章(AVL树的插入删除查找算法实现和分析-1(平衡因子法))中,介绍了如何用平衡因子记录左右子树的高度差的方法来实现AVL树的插入删除和查找的算法,并分析了这种方法的一些缺陷,这里,我将会使用另一种方法来实现这些算法,而且个人觉得比前一篇文章的所写实现更加简单,思路更加清晰。
在介绍这种方法之前,先说说怎么样求一棵二叉树的高度(或深度)。其代码和解释如下:
int BiTreeDepth(BiTree BT)
{
//求树的深度
//从二叉树深度的定义可知,二叉树的深度应为其左、右子树深度的最大值加1,
//而根结点算第0层,高为0。
if(BT == NULL) //若为空树,则返回-1
return -1;
else
{
int nLDepth = BiTreeDepth(BT->LChild); //求左树的深度
int nRDepth = BiTreeDepth(BT->RChild); //求右树的深度
if(nLDepth >= nRDepth)
{
return nLDepth+1;
}
else
{
return nRDepth+1;
}
}
}
明白了怎么求树高后,下面就开始AVL树的插入删除和查找算法的说解:
类型定义为:
typedef int BOOL;
typedef char DataType;
typedef struct AVLNode
{
DataType Data; //数据值
struct AVLNode *LChild; //指向左子树的指针
struct AVLNode *RChild; //指向右子树的指针
int Height; //记录以此结点为根的树的高度
}AVLNode, *AVLTree;
其中还有一些要用到辅助函数,如下:
static int Max( int a, int b )
{
return (a > b ? a : b);
}
//----------------------------------------------------------------------------
static int Height( A