二叉搜索树

来源:互联网 发布:英文面试常见问题知乎 编辑:程序博客网 时间:2024/05/18 01:48

fatal.h

#include <stdio.h>#include <stdlib.h>#define Error( Str )        FatalError( Str )#define FatalError( Str )   fprintf( stderr, "%s\n", Str ), exit( 1 )


tree.h

typedef int ElementType;struct TreeNode;typedef struct TreeNode *Position;typedef struct TreeNode *SearchTree;SearchTree MakeEmpty(SearchTree T);Position Find(ElementType X, SearchTree T);Position FindMin(SearchTree T);Position FindMax(SearchTree T);SearchTree Insert(ElementType X, SearchTree T);SearchTree Delete(ElementType X, SearchTree T);ElementType Retieve(Position P);void PrintElement( SearchTree T );void PreOrder( SearchTree T );void InOrder( SearchTree T );void PostOrder( SearchTree T );void Print(SearchTree T);struct TreeNode{    ElementType Element;    SearchTree Left;    SearchTree Right;};


tree.c

#include"tree.h"#include<stdlib.h>#include"fatal.h"SearchTree MakeEmpty( SearchTree T ){    if( T != NULL )    {        MakeEmpty( T->Left );        MakeEmpty( T->Right );        free( T );    }    return NULL;}Position Find(ElementType X, SearchTree T){    if(T == NULL)        return NULL;    if(X < T->Element)        return Find(X, T->Left);    else if(X > T->Element)        return Find(X, T->Right);    else        return T;}Position FindMin(SearchTree T){    if(T == NULL)        return NULL;    else if(T->Left == NULL)        return T;    else        return FindMin(T->Left);}Position FindMax(SearchTree T){    if(T != NULL)        while (T->Right != NULL)            T = T->Right;    return T;}SearchTree Insert(ElementType X, SearchTree T){    if(T == NULL)    {        T = malloc(sizeof(struct TreeNode));        if(T == NULL)            FatalError("Out of space!!!");        else        {            T->Element = X;            T->Left = T->Right = NULL;        }    }    else if(X < T->Element)        T->Left = Insert(X, T->Left);    else if(X > T->Element)        T->Right = Insert(X, T->Right);    return T;}SearchTree Delete(ElementType X, SearchTree T){    Position TmpCell;    if(T == NULL)        Error("无X!!!\n");    else if(X < T->Element)        T->Left = Delete(X, T->Left);    else if (X > T->Element)        T->Right = Delete(X, T->Right);    else if(T->Left && T->Right)    {        TmpCell = FindMin(T->Right);        T->Element = TmpCell->Element;        T->Right = Delete(T->Element, T->Right);    }    else    {        TmpCell = T;        if(T->Left == NULL)            T = T->Right;        else if(T->Right == NULL)            T = T->Left;        free(TmpCell);    }    return T;}ElementType Retrieve(Position P){    return P->Element;}void PrintElement( SearchTree T ){    printf( "%3d ", Retrieve( T ) );}void PreOrder(SearchTree T){    if(T != NULL)    {        PrintElement(T);        PreOrder(T->Left);        PreOrder(T->Right);    }}void InOrder( SearchTree T ){    if (T != NULL )    {        InOrder( T->Left );        PrintElement( T );        InOrder( T->Right );    }}void PostOrder( SearchTree T ){    if ( T != NULL )    {        PostOrder( T->Left );        PostOrder( T->Right );        PrintElement( T );    }}void Print(SearchTree T){printf("树的遍历如下:\n");printf("先序遍历\n");PreOrder(T);putchar('\n');printf("中序遍历\n");InOrder(T);putchar('\n');printf("后序遍历\n");PostOrder(T);putchar('\n');putchar('\n');}


main.c


#include<stdio.h>#include"tree.h"int main(void){    SearchTree root = NULL;int num, i, temp;printf("请输入序列L的节点个数:");scanf("%d", &num);for(i=0; i<num; i++){scanf("%d", &temp);root = Insert(temp, root);}Print(root);while(1){printf("请输入要删除的节点:");scanf("%d", &temp);Delete(temp, root);Print(root);}    return 0;}