二叉搜索树
一课二叉树,满足以下性质:
1)非空左子树的所有键值小于其根结点的键值
2)非空右子树的所有键值大于其根结点的键值
3)左、右子树都是二叉搜索树
二叉搜索树的查找操作
查找从根节点开始,如果树为空,返回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 Find (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 Find (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 FindMin( 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;
}