首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

树的遍历

2012-02-12 
树的遍历 求助这是我写的树的先序非递归遍历二叉树和中序非递归遍历二叉树,编译没有错,建立二叉树也没有错

树的遍历 求助
这是我写的树的先序非递归遍历二叉树和中序非递归遍历二叉树,编译没有错,建立二叉树也没有错,但是用先序非递归遍历二叉树和中序非递归遍历二叉树输出的是乱码,请求大家帮我看一下,谢了!




#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100

/*节点结构声明*/
typedef struct node
{
  struct node *lch;
  int data;
  struct node *rch;
}BNode;
BNode *t;
BNode *creat_bt0(); /*创建二叉树*/
void PreOrder(BNode *b); /*先序非递归遍历二叉树*/
void preorder(BNode *p); /*输出二叉树*/
void InOrder(BNode *b); /*中序非递归遍历二叉树*/
int x;
void main()
{int k;
  do{
  printf("\n\n");
  printf("\n\n 1.建立二叉树 ");
  printf("\n\n 2.先序非递归遍历二叉树 ");
  printf("\n\n 3.中序非递归遍历二叉树 ");
  printf("\n\n 4.结束程序 ");
  printf("\n------------------------------\n");
  printf("\n 请输入你的选择(1,2,3,4):");
  scanf("%d",&k);
  switch(k)
  {
  case 1:{
  t=creat_bt0();
  preorder(t);
  }break;
  case 2:{
  printf("\n 先序非递归遍历二叉树:\n");
  PreOrder(t);
  }break;
  case 3:{
  printf("\n 中序非递归遍历二叉树:\n");
  InOrder(t);
  }break;
  case 4:exit(0);
  }
  }while(k>=1&&k<=4);
}


/*建立二叉树利用二叉树的性质5,借助一维数组s建立二叉树*/
BNode *creat_bt0()
{
  int i,j; /*寻找双亲节点和和孩子编号的关系*/
  BNode *q,*root,*s[16];
  printf("i,x=");
  scanf("%d%d",&i,&x); /*输入对应节点的编号与内容*/
  while((i!=0)&&(x!=0))
  {
  q=(BNode *)malloc(sizeof(BNode)); /*产生一个节点*/
  q->data=x;
  q->lch=NULL;
  q->rch=NULL;
  s[i]=q;
  if(i==1) /*root为全局变量,为树根节但点*/
  root=q;
  else
  {
  j=i/2;
  if(i%2==0) /*判断是否为左或右孩子*/
  s[j]->lch=q;
  else
  s[j]->rch=q;
  }
  printf("i,x=");
  scanf("%d%d",&i,&x);
  }
  return root;
}


/*输出二叉树内容*/
void preorder(BNode *p)
{
  if(p!=NULL)
  {
  printf("%d\t",p->data);
  preorder(p->lch);
  preorder(p->rch);
  }
}

void PreOrder(BNode *b)
{
  BNode *st[MAXSIZE],*p;
  int top=-1;
  if(b!=NULL)
  { top++;
  st[top]=b;
  while(top>-1)
  { p=st[top];
  top--;
  printf("%c",p->data);
  if(p->rch!=NULL)
  {
  top++;
  st[top]=p->rch;
  }
  if(p->lch!=NULL)
  {
  top++;
  st[top]=p->lch;
  }
  }
  printf("\n");
  }
}


void InOrder(BNode *b)

  BNode *st[MAXSIZE],*p;
  int top=-1;
  if(b!=NULL)
  { p=b;
  while(top>-1||p!=NULL)
  { while(p!=NULL)
  {
  top++;
  st[top]=p;
  p=p->lch;
  }
  if(top>-1)
  {  
  p=st[top];


  top--;
  printf("%c",p->data);
  p=p->rch;
  }
  }
  printf("\n");
  }



[解决办法]
printf( "%c ",p-> data); 
应该换成%d
int型转换成ASCII码,当然容易成乱码了
[解决办法]
同楼上说的:你在先序和中序遍历中都用了printf("%c",p->data);显然这是将p->data这个整型值当作ascii码转化为字符,肯定就乱码啦。
说一句实话哈,你的程序整体结构并不好,全局变量什么的都有啦,感觉太乱。你为什么不写个后序非递归遍历呢?

热点排行