二叉搜索树
1. 非空左子树的所有键值小于其根结点的键值
2. 非空右子树的所有键值小于其根结点的键值
3. 左右子树都是二叉搜素树
二叉搜索树操作函数
1.Posltion Find(ElementType X, BinTree BST); //从二叉搜索树BST中查找元素X,返回其所在结点的地址
2.Posltion FindMin(BinTree BST); //从二叉搜素树BST中查找并返回最小元素所在结点的地址
3.Posltion FindMax(BinTree BST); //从二叉搜索树BST中查找并返回最大元素所在结点的地址
4.BinTree Insert(ElementType X, BinTree BST);
5.BinTree Delete(ElementType X, BinTree BST);
Find 查找效率取决于树的高度
//尾递归
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;
}
Position FindMin (BinTree BST) {
if (!BST) return NULL; //空的二叉搜索树
else if (!BST->Left)
return BST; //找到最左叶结点并返回
else
return FinMin( BST->Left );
}
/*-----------------------------*/
Position FindMax( BinTree BST ) {
if (BST)
while (BST->Right) BST=BST->Right;
return BST
}
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);
return BST;
}
BinTree Delete( ElementType X, BinTree BST ) {
Position Tmp;
if( !BST ) printf("要删除的元素未找到");
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;
}
平衡二叉树