题目描述
本题要求实现给定二叉搜索树的5种常用操作。
函数接口定义:
BinTree Insert( BinTree BST, ElementType X );
BinTree Delete( BinTree BST, ElementType X );
Position Find( BinTree BST, ElementType X );
Position FindMin( BinTree BST );
Position FindMax( BinTree BST );
其中BinTree
结构定义如下:
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
函数Insert
将X
插入二叉搜索树BST
并返回结果树的根结点指针;
函数Delete
将X
从二叉搜索树BST
中删除,并返回结果树的根结点指针;如果X
不在树中,则打印一行Not Found
并返回原树的根结点指针;
函数Find在二叉搜索树BST
中找到X
,返回该结点的指针;如果找不到则返回空指针;
函数FindMin
返回二叉搜索树BST
中最小元结点的指针;
函数FindMax
返回二叉搜索树BST
中最大元结点的指针。
代码
BinTree Insert(BinTree BST, ElementType X )
{
if( !BST ){/*如果原树是空树,生成并返回一个结点的二叉搜索树 */
BST = (BinTree) malloc(sizeof(struct TNode));
BST->Data = X;
BST->Left = BST->Right = NULL;
}
else {/*开始查找要插入元素的位置*/
if(X < BST->Data)
BST->Left = Insert(BST->Left, X);
else if(X > BST->Data)
BST->Right = Insert(BST->Right, X);
}
return BST;
}
BinTree Delete( BinTree BST, ElementType X )
{
Position tmp;
if( !BST )
printf("Not Found\n");
else{
if( X < BST->Data)
BST->Left = Delete(BST->Left, X);
else if( X > BST->Data )
BST->Right = Delete(BST->Right, X);
else{
if(BST->Left && BST->Right){/*如果有左右两个子结点*/
/*从右子树中找最小的元素填充删除结点*/
tmp = FindMin( BST->Right );
BST->Data = tmp->Data;
BST->Right = Delete(BST->Right, BST->Data);
}
else{/*被删除结点只有一个或无子节点*/
tmp = BST;
if( !BST->Left )
BST = BST->Right;
else
BST = BST->Left;
free(tmp);
}
}
}
return BST;
}
Position Find( BinTree BST, ElementType X )
{
if(!BST)return NULL;
else{
if(BST->Data == X)
return BST;
else if( X < BST->Data && BST->Left)
return Find(BST->Left, X);
else if( X > BST->Data && BST->Right)
return Find(BST->Right, X);
else
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) return NULL;
else{
if(!BST->Right) return BST;
else return FindMax(BST->Right);
}
}
遇到的问题和解决方法
空树段错误
主要是Find
、FindMin
、和FindMax
函数没有考虑输入是空树的情况,加上if(!BST) return NULL;
语句就可以了。