本题要求实现给定二叉搜索树的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
中最大元结点的指针。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
void PreorderTraversal( BinTree BT ); /* 先序遍历,由裁判实现,细节不表 */
void InorderTraversal( BinTree BT ); /* 中序遍历,由裁判实现,细节不表 */
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 );
int main()
{
BinTree BST, MinP, MaxP, Tmp;
ElementType X;
int N, i;
BST = NULL;
scanf("%d", &N);
for ( i=0; i<N; i++ ) {
scanf("%d", &X);
BST = Insert(BST, X);
}
printf("Preorder:"); PreorderTraversal(BST); printf("\n");
MinP = FindMin(BST);
MaxP = FindMax(BST);
scanf("%d", &N);
for( i=0; i<N; i++ ) {
scanf("%d", &X);
Tmp = Find(BST, X);
if (Tmp == NULL) printf("%d is not found\n", X);
else {
printf("%d is found\n", Tmp->Data);
if (Tmp==MinP) printf("%d is the smallest key\n", Tmp->Data);
if (Tmp==MaxP) printf("%d is the largest key\n", Tmp->Data);
}
}
scanf("%d", &N);
for( i=0; i<N; i++ ) {
scanf("%d", &X);
BST = Delete(BST, X);
}
printf("Inorder:"); InorderTraversal(BST); printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
10
5 8 6 2 4 1 0 10 9 7
5
6 3 10 0 5
5
5 7 0 10 3
#include
#include
typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
void PreorderTraversal(BinTree BT) /* 先序遍历,由裁判实现,细节不表 */
{
BinTree tmp = BT;
if (!tmp)return;
else
{
{
printf(" %d", tmp->Data);
}
PreorderTraversal(tmp->Left);
PreorderTraversal(tmp->Right);
}
}
void InorderTraversal(BinTree BT) /* 中序遍历,由裁判实现,细节不表 */
{
BinTree tmp = BT;
if (!tmp)return;
else
{
{
}
InorderTraversal(tmp->Left);
printf(" %d", tmp->Data);
InorderTraversal(tmp->Right);
}
}
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);
int main()
{
BinTree BST, MinP, MaxP, Tmp;
ElementType X;
int N, i;
BST = NULL;
scanf("%d", &N);
for (i = 0; i
Data);
if (Tmp == MinP) printf("%d is the smallest key\n", Tmp->Data);
if (Tmp == MaxP) printf("%d is the largest key\n", Tmp->Data);
}
}
scanf("%d", &N);
for (i = 0; i
Data = X;
BST->Left = NULL;
BST->Right = NULL;
return BST;
}
else
{
while (tmp)
{
if (tmp->Data>X)
{
if (!tmp->Left)
{
BinTree newB = (BinTree)malloc(sizeof(struct TNode));
newB->Data = X;
newB->Left = NULL;
newB->Right = NULL;
tmp->Left = newB;
break;
}
else
{
tmp = tmp->Left;
}
}
else
{
if (!tmp->Right)
{
//printf("tmp->data:%d\n", tmp->Data);
//printf("X:%d", X);
BinTree newC = (BinTree)malloc(sizeof(struct TNode));
newC->Data = X;
newC->Left = NULL;
newC->Right = NULL;
tmp->Right = newC;
break;
}
else
tmp = tmp->Right;
}
}
return BST;
}
}
void createnewBinTree(BinTree BST, ElementType X, BinTree *newtree)
{
BinTree tmp = BST;
if (!tmp)return;
else
{
{
if (tmp->Data != X)*newtree=Insert(*newtree, tmp->Data);
}
createnewBinTree(tmp->Left, X, newtree);
createnewBinTree(tmp->Right, X, newtree);
}
}
BinTree Delete(BinTree BST, ElementType X)
{
BinTree tmp = Find(BST, X);
BinTree newBin = NULL;
if (!tmp){ printf("Not Found\n"); return BST; }
else
{
createnewBinTree(BST, X, &newBin);//只有传递指针才能在局部函数里面改变该变量的值
return newBin;
}
}
Position Find(BinTree BST, ElementType X)
{
BinTree tmp = BST;
if (!tmp)return NULL;
if (tmp->Data == X)return tmp;
else
{
if (tmp->Data>X)
tmp = Find(tmp->Left, X);
else
tmp = Find(tmp->Right, X);
}
return tmp;
}
Position FindMin(BinTree BST)
{
BinTree tmp = BST;
if (!tmp)return NULL;
while (1)
{
if (tmp->Left)tmp = tmp->Left;
else return tmp;
}
}
Position FindMax(BinTree BST)
{
BinTree tmp = BST;
if (!tmp)return NULL;
while (1)
{
if (tmp->Right)tmp = tmp->Right;
else return tmp;
}
}
易错点://只有传递指针才能在局部函数里面改变该变量的值,所以构造函数前要确定是否要改变数据的值