一、二叉搜索树(BST)
二叉搜索树(Binary Search Tree),也称二叉排序树或二叉查找树。
二叉搜索树:是一颗二叉树,可以为空;若不为空,满足一下性质:
(1) 非空左子树的所有键值小于其根节点的键值
(2) 非空右子树的所有键值大于其根节点的键值
(3) 左右子树都是二叉搜索树
1.1 二叉搜索树操作的常用操作
Position Find(ElementType X, BinTree BST); // 从二叉搜索树种查找元素X 并返回所在节点的地址
Position FindMin( BinTree BST ); // 从二叉搜索树中查找并返回最小元素
Position FindMax( BinTree BST ); // 最大元素查找
BinTree Insert( ElementType X, BinTree BST ); // 插入
BinTree Delete( ElementType X, BinTree BST ); // 删除
最大元素一定是在树的最优分支的端节点上
最小元素一定是在树的最左分支的端节点上
1.1.1 Find
--> 查找从根节点开始,如果树空,返回NULL
--> 若非空,则根节点关键字和X进行比较,并进行不同处理
[1] 若X小于根节点键值,只需要在左子树继续搜索
[2] 若X大于根节点键值,在右子树继续查找
[3] 若两者比较结果是相等,返回指向此节点的指针
Position Find( ElementType X, BinTree BST )
{
if( !BST ) return NULL;
if( X > BST->Data )
return Find( X, BST->Right ); // 尾递归
else if ( X < BST->Data )
return Find( X, BST->Left ); // 尾递归
else
return BST;
}
由于非递归函数的执行效率高,可将尾递归函数改为迭代函数
Position IterFind( ElementType X, BinTree BST )
{
while( BST ){
if( X > BST->Data )
BST = BST->Right;
else if( X < BST->Data )
BST = BST->Left;
else
return BST;
}
return NULL;
}
查找的效率决定于树的高度
1.1.2 FindMin 递归法
Position FindMin( BinTree BST )
{
if( !BST ) return NULL; /*树空*/
else if( !BST->Left )
return BST; /*找到最左叶节点*/
else
return FindMin( BST->Left ); /*沿左分支继续查找*/
}
1.1.3 FindMax 迭代法
Position FindMax( BinTree BST )
{
if( BST )
while( BST->Right )
BST = BST->Right; /*沿右分支找到最右端*/
return BST;
}
1.1.4 Insert
关键是要找到元素应该插入的位置,可以采用与Fin类似的方法
BinTree Insert( ElementType X, BinTree BST )
{
if( !BST ){
/*若原树为空,则生成并返回一个节点的二叉搜索树*/
BST = malloc( sizeof( struct TreeNode ) );
BST->Data = X;
BST->Left = BST->Right = NULL;
}else{ /*开始找要插入元素的位置*/
if( X < BST->Data )
BST->Left = Insert( X, BST->Left ); /*递归插入左子树*/
else if( X > BST->Data )
BST->Right = Insert( X, BST->Right );/*递归插入右子树*/
/*else X已经存在,什么都不做*/
return BST;
}
}
1.1.5 Delete
考虑三种情况
[1] 删除的是叶子节点:直接删除,并修改其父节点指针为NULL
[2] 删除的节点只有一个孩子节点:将其父节点的指针指向要删除节点的孩子节点
[3] 删除的节点有左右子树:用另一节点替代被删除节点: 有子树的最小元素或者左子树的最大元素
BinTree Delete( ElementType X, BinTree BST )
{
Position Tmp;
if( !BST ) return BST; /*树空*/
else if( X < BST->Data )
BST->Left = Delete( X, BST->Left ); /*左子树递归删除*/
else if( X > BST->Data )
BST->Right = Delete( X, BST->Right ); /*右子树递归删除*/
else{
if( BST->Left && BST->Right ){/*被删除节点有左右子树*/
Tmp = FindMin( BST->Right );/*在右子树找最小元素填充节点*/
BST->Data = Tmp->Data;
/*在删除节点的右子树中删除最小元素*/
BST->Right = Delete( BST->Data, BST->Right );
}else{/*被删除节点有一个或无子节点*/
Tmp = BST;
if( !BST->Left ) /*有右子树或无子树*/
BST = BST->Right;
else if( !BST->Right ) /*有左子树或无子树*/
BST = BST->Left;
free( Tmp );
}
}
return BST;
}
二、平衡二叉树
平衡因子(Balance Factor, BF): BF(T) = hL - hR hL,hR分别为T的左右子树高度。
平衡二叉树:
空树,或者,任一节点左、右子树高度差的绝对值不超过1,即|BF(T) <= 1|
给定节点数为n的AVL树的最大高度为 O(log2n)