您的位置:首页 > 其它

二叉查找树

2012-09-13 22:39 239 查看
#include <stdio.h>
#include <stdlib.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 RETRIVE( Position P);

void PrintElement (SearchTree T);
void PreOrder(SearchTree T);
void InOrder(SearchTree T);
void PostOrder(SearchTree t);

struct TreeNode
{
    ElementType Element;
    SearchTree Left;
    SearchTree Right;
};

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

Position FindMax(SearchTree T)
{
  if( T == NULL)
    return NULL;
  else if( T->Right == NULL)
    return T;
  else return FindMax(T->Right);
}

SearchTree Insert(ElementType X, SearchTree T)
{
  if(T == NULL)
  {
    T = malloc(sizeof(struct TreeNode));
    if( T == NULL)
      printf("内存分配失败");  
    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)
    printf("ERROR ");
  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 RETRIVE(Position P)
{
  return P->Element;
}

oid PrintElement (SearchTree T)
{
    printf("%3d ",RETRIVE(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);
    }
}

oid PostOrder(SearchTree T)
{
  if(T != NULL)
  {
    PostOrder(T->Left);
    PostOrder(T->Right);
    PrintElement(T);
  }
}

int main()
{
SearchTree T = NULL;
int i, j, m, n;
ElementType tmp;
printf( "Number of Elements:" );
scanf( "%d", &n );
for ( i = 0; i < n; i++)
{
scanf( "%d", &tmp );
T = Insert( tmp, T );
}
printf( "\nPreOrder :" );
PreOrder( T );
printf( "\nInOrder :" );
InOrder( T );
printf( "\nPostOrder:" );
PostOrder( T );
printf( "\n" );
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: