回 帖 发 新 帖 刷新版面

主题:[讨论]二叉树的遍历问题

二叉树 输入问题
程序一直停留在输入函数中 输出语句没有运行
请问这个是甚么原因

#include <stdio.h>
#include <stdlib.h>

typedef struct tree 

char  data; 
struct tree *l;/*左儿子*/ 
struct tree *r; 
}tr; 

main() 

tr *head=NULL; 
tr *create();/*二叉树的建立*/ 
void preorder(); 
void inorder(); 
void postorder(); 
system("cls"); 
head=create(head); 
printf("\n\n"); 
printf("\nThe preorder is:"); 
  preorder(head); 
         printf("\nThe inorder is:"); 
  inorder(head); 
  printf("\nThe postorder is:"); 
  postorder(head); 
}

tr *create(tr *t)/*二叉树的建立*/ 
{    
  tr *k=NULL; 
  char ch; 
  scanf("%s",&ch); 
  if(ch=='!')t=NULL; 
  else { t=(tr *)malloc(sizeof(tr)); 
    t->data=ch; 
    t->l=t->r=NULL; 
    t->l=create(k); 
    t->r=create(k); 
   } 
return(t); 
}

void preorder(tr *head)/*先续遍例*/ 
{ tr *t=NULL; 
t=head; 
if(t) 
{ printf("%c\t",t->data); 
  preorder(t->l); 
  preorder(t->r); 
}


void inorder(tr *head)/*中续遍例*/ 
{ tr *t=NULL; 
t=head; 
if(t) 

  inorder(t->l); 
  printf("%c\t",t->data); 
  inorder(t->l); 

}

void postorder(tr *head)/*后续遍例*/ 
{ tr *t=NULL; 
t=head; 
if(t) 

  postorder(t->l); 
  postorder(t->l); 
  printf("%c\t",t->data); 

}

回复列表 (共4个回复)

沙发

主要是输入的顺序问题,你怎么输入这些数据的

板凳

中序和后序存在一点小小的错误

3 楼


楼主应该试试从文件录入二叉树,我们老师都这样做的,但是没听的太懂

4 楼

void inorder(tr *head)/*中续遍例*/ 
{ tr *t=NULL; 
t=head; 
if(t) 

  inorder(t->l); 
  printf("%c\t",t->data); 
  inorder(t->l);**************/*改为inorder(t->r),因为要开始遍历右子树*/ 

}
void postorder(tr *head)/*后续遍例*/ 
{ tr *t=NULL; 
t=head; 
if(t) 

  postorder(t->l); 
  postorder(t->l);/* 改为postorder(t->r),原因还是相同的*/ 
  printf("%c\t",t->data); 

}
B
 
再就是,楼主不妨看看这个程序:我编的,,仔细琢磨一下,就行了,
 #include "stdio.h"
 #include "stdlib.h"
 #include "string.h"
 typedef struct stree
 {int data;
  struct stree *lchild,*rchild;
  }tree,*ree;
  /* 建立一个*/
  tree *creat()
  {ree  t;
  char ch;
  scanf("%c ",&ch);
  if(ch=='#')
   t=NULL;
  else
  {
  t=(tree *)malloc(sizeof(tree));
  t->data=ch;
    t ->lchild=creat();
    t->rchild=creat();
  }
  return  t;
  }
  /* xian xu */
  void intree(ree t)
  { if(t)
   { printf("%c",t->data);
     intree(t->lchild);
     intree(t->rchild);
   }
   }

 
  /* 中序*/
  void order(ree t)
  {
  if(t)
   {
     order(t->lchild);
     printf("%c",t->data);
     order(t->rchild);
    }
   }
  /* 后续*/
  void ned(ree t)
  {   if(t)
   {
     ned(t->lchild);/*注意开始的时候了 ,我是用的直接复制的这个先序的,所以会错误啊既inporde(t->lchild)*/?
     ned(t->rchild);
      printf("%c",t->data);
    }
   }
    /*叶子总数是*/
  int count(ree t)
  { if(t==NULL)
    return 0;
    else if((t->lchild==NULL)&&(t->rchild==NULL))
     return (1);
    else
     return(count(t->lchild)+count(t->rchild));
   } 
  /* 叶子总数*/
 int count2(ree t)
    { int i=0,j=0;
  if(!t)
    return 0;
    else

    { i=count2(t->rchild);
      j=count2(t->lchild);
    }
    if(i==0&&j==0)
    return (1);
    else
    return (j+i);
   }
 /* 球深度*/
 int deep(ree s)
    { int i,j;
  if(!s)
  return (0);
  else
  { i=deep(s->lchild);
    j=deep(s->rchild);
  }
  return((i>j?i:j)+1);
  }
  /* all*/
  int all(ree s)
  {
  int i,j;
  if(!s)
  return (0);
  else
  { i=deep(s->lchild);
    j=deep(s->rchild);
  }
  return (j+i+1);
 }
   main()
   {   int n=0 ;
     ree s;
     s=creat();
    n=count(s);
    printf("the thief is%4d\n",n);
    n=count2(s);
     printf("\nthe thief is%4d\n",n);
    intree(s);
      printf("\n zhognxu  :\n");
    order(s);
    printf("\n hou xu :\n");
    ned(s);

    printf("\n the DEEP is %4d\n",deep(s));
    printf("\n the all is %4d\n",all(s));
    getch();
  }

在win tc种实验通过,

我来回复

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