回 帖 发 新 帖 刷新版面

主题:急需!!求助"二叉树程序~"

要求:
    求二叉树的高度;
    .....所有结点数;
    .....所有叶结点数;
    能按各种遍历(前序,中,后,层次)输出所有结点;
    能进行查找操作;

哪位朋友能帮个忙啊~~小弟万分感谢!!!!

回复列表 (共3个回复)

沙发

#include<stdio.h>
#include<stdlib.h>
#define M 100
#define ERROR 0
#define FALSE 0
#define TURE 1
#define OK 1

typedef  int  status;
typedef struct Bitree 
{
 char data;
 struct  Bitree *lchild, *rchild;
}Bitree,*bitree;

typedef struct 
{
 bitree a[M];
    int top ;
}stack;

status InitStack(stack *s)//初始化栈
{
 s->top = 0;

 return OK;
}

status PushStack(stack *s,bitree *T)//进栈操作


 if (s->top > 100)
 {
  return ERROR;
 }
 
   s->a[++s->top] = (*T);

 return OK;
}

status PopStack (stack *s, bitree *T)//出栈操作
{
 
 if ( s->top == 0)
 {
  return ERROR;
 }
    (*T) = s->a[s->top--];
 return OK;
}

status EmptyStack(const stack *s)//判断是否为空
{
 if ( s->top == 0)
 {
  return TURE;
 }
 else
 {
  return FALSE;
 }
}


status CreatBitree(bitree *T)//建树
{
    char ch;

 printf("请输入字符:");
 scanf("%c",&ch);
    getchar();
 printf("\n");
 if ( ch == ' ')
 {
  (*T) = NULL;
      return 0;
 }
    else
 {
  (*T) = (bitree)malloc(sizeof(Bitree));
  if(*T==NULL)
  {
   printf("memory allocation failed ,Goodbye");
   exit(1);
  }
     (*T)->data = ch;
  CreatBitree(&(*T)->lchild);
        CreatBitree(&(*T)->rchild);
 }
    return OK;
}

status PreOrderTraverse( bitree *T)//前序遍历
{
 stack s;
 InitStack(&s);
 
 while ((*T) != NULL || !EmptyStack(&s))
 {
  while (*T)
  {
   printf("%c",(*T)->data);
            PushStack(&s,&(*T));
   (*T) = (*T)->lchild;
  }
  if (!EmptyStack(&s))
  {
   PopStack(&s,&(*T));
   (*T) = (*T)->rchild;
  }
 }
    return OK;
}
status InorderTraverse( bitree *T)//中序遍历
{
 stack s;
 InitStack(&s);

 while((*T) != NULL || !EmptyStack(&s))
 {
  while (*T)
  {
   PushStack(&s,&(*T));
            (*T) = (*T)->lchild;
  }
  if (!EmptyStack(&s))
  {
   PopStack(&s,&(*T));
   printf("%c",(*T)->data);
   (*T) = (*T)->rchild;
  }
 }
 return OK;
}

status BefororderTraverse(bitree *T)//后序遍历
{
 int flag = 0;
 stack s;
 InitStack(&s);

 while((*T) != NULL || !EmptyStack(&s))
 {
  while (*T)
  {
   PushStack(&s,&(*T));
            (*T) = (*T)->lchild;
      flag = 0;
  }
       if (!EmptyStack(&s) && flag == 1)
  {
   printf("%c",(*T)->data);
  }
  if (!EmptyStack(&s))
  {
            PopStack(&s,&(*T));
         (*T) = (*T)->rchild;
            flag = 1;
  }
 }
 return OK;
}

int main(void)
{
 bitree T;

    int select ;

    CreatBitree(&T);

 do
 {
  printf("1:      进行前序遍历\n");
     printf("2:      进行中序遍历\n");
  printf("3:      进行后序遍历\n");
     printf("请选择:");
  scanf("%d",&select);
 }while( select < 1 || select > 4);
 
 switch(select)

 {
 case 1:
  printf("前序遍历:");
        PreOrderTraverse(&T);
        printf("\n");
  break;
 case 2:
        printf("\n中序遍历");
        InorderTraverse(&T);
     printf("\n");
  break;
 case 3:
        printf("\n后序遍历");
        BefororderTraverse(&T);
        printf("\n");
    default:
     break;
 }

 system("pause");
 return 0;
}

后序遍历还有点问题 


板凳

//////////////////////////////////////////////////////////////////
//////////////////目的:2叉树的基本操作(查找元素还有问题)
//////////////////////////////////////////////////////////////////
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#define INITSTACKSIZE 100
#define INCREMENT 10
#define TURE 1
#define ERROR 0
#define OK 1
#define M 100
typedef int SElemType;
typedef int status ;
static int number=1;

typedef struct bitnode//定义一个2叉数
{
 char data;
 struct bitnode *lchild ,*rchild;
}bitnode ,*bitree;

int CreatBitree(bitree *T)//建立一个2叉树
{
 char ch;
 
 printf("请输入字符:");
 scanf("%c",&ch);
    getchar();//吃掉残留的数据
 if ( ch ==' ')
 {
  (*T)=NULL;
         return 0;
 }
 else
 {
  (*T) = (bitree)malloc(sizeof(bitnode));
        if((*T) == NULL)
  {
   printf("memory allocation failed,goodbye");
   exit(1);
  }
  (*T)->data=ch;
  CreatBitree(&(*T)->lchild);
  CreatBitree(&(*T)->rchild);
 }

    return OK;
}

void PreOrderTraverse1(bitree T)// 前序遍历递归形式
{
 if(T)
 {
        printf("%c",T->data);
        PreOrderTraverse1((*T).lchild);
        PreOrderTraverse1((*T).rchild);
 }

}

void PreOrderTraverse2(bitree T)// 前序遍历非递归形式
{
 int top = 0;
 bitree a[M];
 
    
 while (T!=NULL||top!=0)
 {
  while ( T!=NULL)
  {
      printf("%c",T->data);
   a[++top] = T;
   T = T->lchild;
  }
  
  if(top > 0)
  {
   T = a[top--];
   T = T->rchild;
  }
 }
}

void InOrderTraverse1(bitree T)//中序递归形式访问
{
 if(T)

 {
        InOrderTraverse1(T->lchild);
  printf("%c",T->data);
  InOrderTraverse1(T->rchild);
 }
}

void InOrderTraverse2(bitree T)//中序非递归形式
{
 int top = 0;
 bitree s[M];
 

 while(T!=NULL||top!=0)
 {
  while(T!=NULL)
  {
   s[++top] = T;
   T = T->lchild;
  }
  
  if (top>0)
  {
   T = s[top--];
   printf("%c",T->data);
   T = T->rchild;
  }
 }
}

void BerforOrderTraverse1(bitree T)//后序递归形式
{

    if(T)
 {
  BerforOrderTraverse1((*T).lchild);
  BerforOrderTraverse1((*T).rchild);
  printf("%c",T->data);
 }
}

void BerforOrderTraverse2(bitree t) //后序非递归形式(别人写的 我复制 以后多要看)
 {
    typedef struct node 
       { 
    bitree  t; 
       int tag;   
       } stack;
      stack s[100] ;
       int top=0;
      while (t!=NULL|| top!=0)
      {
    while (t!=NULL) 
          {
     s[++top].t=t;  
     s[top].tag=0; 
     t=t->lchild; 
    }
         while (top!=0 && s[top].tag==1) 
   {
    printf("%c" ,s[top--].t->data);
   }
      if (top) 
   { 
      s[top].tag=1;  
         t = s[top].t->rchild ; 
   }
  } 
}
   
  
  
  
status Depth(bitree T) //求树的深度
{
 int i = 0;
 int j = 0;

 if(!T)
 {
  return 0;
 }
 else
 {
  i = Depth(T->lchild);
  j = Depth(T->rchild);
 
  return ((i>j?i:j)+1);
 
 }



status Node2(bitree T)//求度为2的结点个数
{
 int i = 0;
 int j = 0;
 
 if(!T)
 {
  return 0;
 }
 else
 {
  j = Node2(T->lchild);
  i = Node2(T->rchild);
  if(i!=0&&j!=0)
   return (i+j+1);
  else
   return (i+j);
 }
}

int Node(bitree T)//求所有的接点数
{
 int i=0;
    int j=0;

 if(!T)
 {
  return 0;
 }

 else
 {
  i = Node(T->lchild);
  j = Node(T->rchild);
  
  return (i+j+1);
 }
}

int Node0(bitree T)//叶子接点的个数
{   
 int i ,j;
 
 if(!T)
 {
  return 0;
 }
 else
 {
    i = Node0(T->lchild);
    j = Node0(T->rchild);

    if(i==0&&j==0)
     return (i+j+1);
    else
     return (i+j);
 }
}

void locate(bitree t, char  x)
 {
   bitree p;
   p=t;
   if (t == NULL)
    printf("0\n");
   else if( t->data == x)
     printf("%d\n",p->data);
   else 
   {
      p=t->lchild;
      if (p)
        locate(t->lchild, x);
      else
       locate(t->rchild, x);
   }
}


3 楼

int main(void)
{
 bitree T;
    int choose;
    char num;
 int flag = 1, sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;

 CreatBitree(&T);

 while(1)
    {
   printf("\n");
  do
  {
  printf("1:*****************  先序递归遍历形式\n");
  printf("2:*****************  先序非递归遍历形式\n");
        printf("3:*****************  中序递归遍历形式\n");
  printf("4:*****************  中序非递归遍历形式\n");
     printf("5:*****************  后序递归遍历形式\n");
  printf("6:*****************  后序非递归遍历形式\n");
  printf("7:*****************  计算所有结点个数\n");
  printf("8:*****************  计算叶子结点个数\n");
  printf("9:*****************  算度为2的结点个数\n");
  printf("10:****************  计算树的深度\n");
  printf("11:****************  查到相同的元素\n");
  printf("12:****************  退出\n");
  printf("请选择你需要执行的任务:");
  scanf("%d",&choose);
  
  if(choose == 12)
  {
   flag = 0;
        }
  
  }while(choose<0||choose>12);

   if(flag==0)
   {
    break;
   }
   
     switch(choose)
  {
      case 1:
    {
     printf("\n先序递归遍历形式:");
                 PreOrderTraverse1(T);
        printf("\n");
    }
    
    break;
   
   case 2:
    {
     printf("\n先序非递归遍历形式:");
     PreOrderTraverse2(T);
        printf("\n");
    }
             
    break;

      
   case 3:
    {
     printf("\n中序递归遍历形式:");
                 InOrderTraverse1(T);
        printf("\n");
    }
             
    break;
   
   case 4:
    {
     printf("\n中序非递归遍历形式:");
                 BerforOrderTraverse1(T);
        printf("\n");
    }
    break;

 
   case 5:
    {
     printf("\n后序递归遍历形式:");
                 BerforOrderTraverse1(T);
        printf("\n");
    }
    
    break;

   case 6:
    {
     printf("\n后序非递归遍历形式\n");
                 BerforOrderTraverse2(T);
    }
    break;

   case 7:
    { 
     printf("\n计算所有结点个数:");
                 sum1 = Node(T);
        printf("%d\n",sum1);
    }
    break;

   case 8:
    {  
     printf("\n计算叶子结点个数:");
     sum2 =Node0( T);
        printf("%d\n",sum2);
    }
    break;
   case 9:
    {    
     printf("计算度为2的结点个数:");
     sum3 = Node2(T);
        printf("%d\n",sum3);
    }

    break;

   case 10:
    {    
   
     printf("计算树的深度:");
     sum4 =  Depth(T) ;
        printf("%d\n",sum4);
    }

    break;
         
   case 11:
    {
     printf("请输入需要查找的元素:");
     scanf("%c",&num);
                 getchar();
     locate(T, num);
    }
    break;

   default:
    {
     break;
    }
  }
  
  }
   
  system("pause");
  return 0;
}
  

我来回复

您尚未登录,请登录后再回复。点此登录或注册