回 帖 发 新 帖 刷新版面

主题:请教数据结构问题

课程设计:
二叉树的遍历及应用。
[问题描述]建立二叉树,并输出二叉树的先序、中序和后序遍历序列,以及二叉树的叶子数。
[实现提示]可通过输入带空格的前序序列建立二叉链表。

回复列表 (共3个回复)

沙发

输入格式是不是这样:
root
  left
    lleft
    lright
  right
    rleft
    rright

板凳

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

3 楼

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

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


我来回复

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