您的位置:首页 > 理论基础 > 数据结构算法

二叉树排序 --C语言数据结构

2008-08-20 09:48 316 查看
 #include <stdio.h>
#include <stdlib.h>

typedef struct btree
{
 int data;
 struct btree *left;
 struct btree *right;
}BTR,*PBTR;

typedef struct BTRSt
{
  PBTR ptree;
  struct BTRSt *link;
}Stack,*PStack;

PBTR Bitree=NULL;
/*
函数功能:实现非递归建立二叉树
函数原型:void creat_btree(int *a,int size)
函数参数:int *a :保存二叉树节点的数组首地址
           int size:节点数目
函数返回值:void
作者 :  李文塔 Wenta Li
日期:    2008年5月19日
优点:建立的二叉树按中序遍历后:是从小到大有序的可以是一种排序算法
*/
void creat_btree(int *a,int size)
{
    int i;
    PBTR pre,pre2;
    for(i=0;i<size;i++)
    {
    if(Bitree==NULL)
    {
     Bitree=(PBTR)malloc(sizeof(BTR));
     if(Bitree==NULL)
     {
       printf("Malloc fail/n");
       break;
     }
     else
     {
        Bitree->data=a[i];
        Bitree->left=NULL;
        Bitree->right=NULL;
        continue;
       }
    }
     else
    {
        pre = Bitree;
     }
    
     while(1)
     {
     if(a[i]>pre->data)
     {
       if(pre->right==NULL)
       {
       pre2=(PBTR)malloc(sizeof(BTR));
       if(pre2==NULL)
       {
          printf("Malloc fail/n");
          break;
         }
         else
         {
          pre2->data=a[i];
          pre2->left=NULL;
          pre2->right=NULL;
           pre->right=pre2;
           break;
         }
       }
       else
      {
        pre=pre->right;  
       }
       }
     else
     {
        if(pre->left==NULL)
       {
       pre2=(PBTR)malloc(sizeof(BTR));
       if(pre2==NULL)
       {
          printf("Malloc fail/n");
          break;
         }
         else
         {
          pre2->data=a[i];
          pre2->left=NULL;
          pre2->right=NULL;
           pre->left=pre2;
           break;
         }
       }
       else
      {
        pre=pre->left;  
       }
       
       }    
     }
     }  
}
/*
函数功能:实现递归前序遍历二叉树
函数原型:void preorder(PBTR head)
函数参数:PBTR :保存二叉树根节点
函数返回值:void
作者 :  李文塔 Wenta Li
日期:    2008年5月19日
*/
void preorder(PBTR p)
{
  if(p!=NULL)
  {
  printf("%4d",p->data);
  preorder(p->left);
  preorder(p->right);     
  }   
}

/*
函数功能:实现递归中序遍历二叉树
函数原型:void midorder(PBTR head)
函数参数:PBTR :保存二叉树根节点
函数返回值:void
作者 :  李文塔 Wenta Li
日期:    2008年5月19日
*/
void midorder(PBTR p)
{
  if(p!=NULL)
  {
  midorder(p->left);
  printf("%4d",p->data);
  midorder(p->right);     
  }   
}

/*
函数功能:实现递归中序遍历二叉树
函数原型:void postorder(PBTR head)
函数参数:PBTR :保存二叉树根节点
函数返回值:void
作者 :  李文塔 Wenta Li
日期:    2008年5月19日
*/
void postorder(PBTR p)
{
  if(p!=NULL)
  {
  postorder(p->left);
  postorder(p->right); 
  printf("%4d",p->data);    
  }   
}

/*
函数功能:递归求二叉树的深度
函数原型:int btreedepth(PBTR head)
函数参数:PBTR :保存二叉树根节点
函数返回值:int :二叉树的深度
作者 :  李文塔 Wenta Li
日期:    2008年5月21日12:14
*/

int btreedepth(PBTR head)
{int h,hl,hr;
 PBTR p;
 p=head;
 if(p==NULL)
 {
 h=0;
 }
 else
 {
  hl=btreedepth(p->left);
  hr=btreedepth(p->right);
   if(hl>hr)
   {
  h=hl+1;
  }
  else
  {
    h=hr+1;
  }
 }
  return h; 
}
/*主函数 main()作测试用*/
#define N 12
int main()
{   int h;
   int a
={1,45,89,13,24,56,39,78,79,69,20,44};
   printf("非递归建立建立二叉树..../n");
   creat_btree(a,N);
    printf("前序遍历:      ");
   preorder(Bitree);
   printf("/n非递归建立建立二叉树后中序遍历就是按照由小到大排序");
   printf("/n中序遍历:      ");
   midorder(Bitree);
   printf("/n后续遍历:      ");
   postorder(Bitree);
  printf("/n二叉树的深度是:/n");
  printf("%4d/n",btreedepth(Bitree));
  
  getchar();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: