二叉搜索树

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值