| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 389 人关注过本帖
标题:我的二叉树错在哪里?
只看楼主 加入收藏
yxy1995523
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2012-11-15
结帖率:66.67%
收藏
 问题点数:0 回复次数:1 
我的二叉树错在哪里?
void preorder(BTREE *root)
{//非递归实现的先序遍历

typedef    struct
    {
        char type[100];
        int top;
    }seqstack;   
 int top=0;
seqstack stack[MAXSIZE];
  BTREE *p;
 p=root;
  

  printf("%c",root->data);
  do
  {
    while(p!=NULL)
    {
                printf("%c",p->data);
        stack[++top]=p;
        p=p->lchild;
    }
   p->data=stack[top];
   p=p->rchild;
  }while(1)
}

机器指出的错误是  p->data=stack[top]; 这句和stack[++top]=p;类型不匹配 。
昨天思考了一个下午 ,毫无头绪。求指点啊;;
这是完整的代码 。非递归先序遍历.



#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef char elemtype;
typedef struct  bitree
{   
    elemtype data;
    struct bitree *lchild,*rchild;
}BTREE;

BTREE *create()
{//非递归创建二叉树
   BTREE *q[100]; //定义q数组作为队列存放二叉链表中结点,100为最大容量
   BTREE *s;                //二叉链表中的结点
   BTREE *root ;            //二叉链表的根指针
   int front=1,rear=0,i;      //定义队列的头、尾指针
   char ch;                 //结点的data域值
   root=NULL;
   for(i=0;i<100;i++)
       q[i]=NULL;
   printf("请按层次依次输入二叉树中的结点:\n");
   printf("空结点以逗号代替,以#号结束!\n");
   ch=getchar();
   while(ch!='#')     //输入值为#号,算法结束
    {
       s=NULL;
       if(ch!=',')    //输入数据不为逗号,表示不为虚结点,否则为虚结点
        {
           s=(BTREE *)malloc(sizeof(BTREE));   s->data=ch;
           s->lchild=NULL;                     s->rchild=NULL;
        }
       rear++;
       q[rear]=s;    //新结点或虚结点进队
       if(rear==1)
         root=s;
       else
        {
          if((s!=NULL)&&(q[front]!=NULL))
            {
              if(rear%2==0)
                q[front]->lchild=s;   //rear为偶数,s为双亲左孩子
              else
                q[front]->rchild=s;   //rear为奇数,s为双亲右孩子
            }         
          if(rear%2==1) front++;    //出队
        }  
       ch=getchar();      
    }
   return root;
}

void preorder(BTREE *root)
{//非递归实现的先序遍历

typedef    struct
    {
        char type[100];
        int top;
    }seqstack;   
 int top=0;
seqstack stack[MAXSIZE];
  BTREE *p;
 p=root;
  

  printf("%c",root->data);
  do
  {
    while(p!=NULL)
    {
        
        printf("%c",p->data);
        stack[++top]=p;
        p=p->lchild;
    }
   p->data=stack[top];
   p=p->rchild;
  }while(top>0);

}

void inorder(BTREE *root)
{//非递归实现的中序遍历
  













}

void postorder(BTREE *root)
{//非递归实现的后序遍历  
  BTREE *p,*s1[100];             //s1栈存放树中结点
  int s2[100],top=0,b;           //s2栈存放进栈标志
  p=root;
  do
   {
     while(p!=NULL)
        {
         s1[top]=p;
         s2[top++]=0;    //第一次进栈标志为0
         p=p->lchild;
        }
     if(top>0)
     {
      b=s2[--top];
      p=s1[top];
      if(b==0)
       {
          s1[top]=p;
          s2[top++]=1;  //第二次进栈标志为0
          p=p->rchild;
        }
      else
        {
          printf("%c",p->data);
          p=NULL;
        }
     }
   }while(top>0);
}

void  lorder(BTREE  *root)
{//非递归实现的层次遍历  
    BTREE *q[MAXSIZE],*p;      // maxsize为最大容量
    int f,r;                   // f,r类似于头尾指针
    q[1]=root;
    f=r=1;
    while(f<=r)
        {
         p=q[f];
         f++;                 //出队
         printf("%c",p->data);
         if(p->lchild!=NULL)
            {
             r++;
             q[r]=p->lchild;
            }        //入队
         if(p->rchild!=NULL)
            {
             r++;
             q[r]=p->rchild;
            }   //入队
        }
}

void showmenu()
{//显示菜单
    printf("    欢迎使用二叉树操作演示小软件\n");
    printf("\t1、创建二叉树\n");
    printf("\t2、先序遍历二叉树\n");
    printf("\t3、中序遍历二叉树\n");
    printf("\t4、后序遍历二叉树\n");
    printf("\t5、层次遍历二叉树\n");
    printf("\t6、退出程序\n");   
}

void main()
{
    BTREE *root=NULL;
    int no;
    while(1)
    {
        showmenu();
        printf("   请输入你的选择:");
        scanf("%d",&no);
        fflush(stdin);//清除键盘缓冲区
        switch(no)
        {
          case 1:root=create();
                 printf("二叉树创建成功,按任意键继续…\n");
                 getch();
                 system("cls");
                 break;
          case 2:printf("二叉树先序遍历结果为:\n");
                 preorder(root);
                 printf("\n");
                 system("pause");
                 system("cls");
                 break;
          case 3:printf("二叉树中序遍历结果为:\n");
                 inorder(root);
                 printf("\n");
                 system("pause");
                 system("cls");
                 break;
          case 4:printf("二叉树后序遍历结果为:\n");
                 postorder(root);
                 printf("\n");
                 system("pause");
                 system("cls");
                 break;
          case 5:printf("二叉树层次遍历结果为:\n");
                 lorder(root);
                 printf("\n");
                 system("pause");
                 system("cls");
                 break;
          case 6:return;
          default:
                 printf("你的输入有误,请从新输入!\n");                 
        }
    }
}
搜索更多相关主题的帖子: 二叉树 
2014-06-05 08:13
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:0 
你出的问题是什么?

我不是砖家,要努力成为砖家。
2014-06-06 18:05
快速回复:我的二叉树错在哪里?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014761 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved