本題要求實現給定二叉搜索樹的5種經常使用操做。c++
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
Preorder: 5 2 1 0 4 8 6 7 10 9 6 is found 3 is not found 10 is found 10 is the largest key 0 is found 0 is the smallest key 5 is found Not Found Inorder: 1 2 4 6 8 9
代碼;測試
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;
if(X>BST->Data)
return Find(BST->Right,X);
else if(X<BST->Data)
return Find(BST->Left,X);
else
return BST;
}
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;
}指針