二叉搜索树的操作集

来源:互联网 发布:藏头诗软件下载 编辑:程序博客网 时间:2024/05/17 13:40

二叉搜索树的操作集

#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;}/* 你的代码将被嵌在这里 */void PreorderTraversal( BinTree bt )//先序遍历二叉树 {    if(bt!=NULL)    {        printf("%d ",bt->Data);        PreorderTraversal(bt->Left);        PreorderTraversal(bt->Right);    }}void InorderTraversal( BinTree bt )//中序遍历二叉树  {    if(bt!=NULL)    {        InorderTraversal(bt->Left);        printf("%d ",bt->Data);        InorderTraversal(bt->Right);    }}BinTree Insert( BinTree BST, ElementType X ){    if(BST==NULL)    {        BST = (struct TNode *)malloc(sizeof(struct TNode));        BST->Data=X;        BST->Left=NULL;        BST->Right=NULL;    }    else if(X<BST->Data)    {        BST->Left=Insert(BST->Left,X);    }     else     {        BST->Right=Insert(BST->Right,X);    }    return BST;}BinTree Delete( BinTree BST, ElementType X ){    BinTree 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 if(!BST->Right)                BST=BST->Left;            free(Tmp);        }    return BST;}Position Find( BinTree BST, ElementType X ){    if(!BST)        return NULL;    if(X==BST->Data)    {        return BST;    }    else if(X<BST->Data)    {        return Find(BST->Left,X);    }    else if(X>BST->Data)        return Find(BST->Right,X);}Position FindMin( BinTree BST ){    if(!BST)        return NULL;    if( BST->Left != NULL )        return FindMin(BST->Left);    else        return BST;}Position FindMax( BinTree BST ){    if(!BST)        return NULL;    if( BST->Right != NULL )        return FindMax(BST->Right);    else        return BST;}