| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 387 人关注过本帖
标题:求指导,二叉树创建和遍历那里错了呢。
只看楼主 加入收藏
pmy931117
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2012-7-14
结帖率:33.33%
收藏
已结贴  问题点数:16 回复次数:2 
求指导,二叉树创建和遍历那里错了呢。
程序代码:
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#define OVERFLOW -1
#define ERROR 0
#define OK 1
#define STACK_INIT_SIZE 100;
#define STACKINCREMENT 10;
typedef int Status;
typedef char TElemType;


typedef struct BiTNode{
        char data;
        struct BiTNode *lchild;//左右孩子指针
        struct BiTNode *rchild;
        }BiTNode,*BiTree;
typedef struct{ 
  char *base;
  char *top;
  int stacksize;
}SqStack;

int InitStack(SqStack &S);
int  PopStack(SqStack &S,char e);
int PushStack(SqStack &S,char e);
int StackEmpty(SqStack S);
void Postorder(BiTNode  *p);
int StackEmpty(SqStack S); 
    
int CreateBiTree(BiTree &T)

 //按先序次序输入二叉树中结点的值,空格字符表示空树

 //构造二叉链表表示的二叉树T
 {
   char ch; 
   printf("请输入元素:\n");                     
   scanf("%c",&ch);
   if(ch==' ')T=NULL;
   else{
      if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))exit(OVERFLOW);
      T->data=ch;
      CreateBiTree(T->lchild);
      CreateBiTree(T->rchild);
      }
       return OK; 
  }//CreateBiTree
  
void  Postorder( BiTNode  *p)  { 
     if (p!=NULL)     
     {Postorder( p->lchild );
      Postorder(p->rchild ) ; 
      printf("%c",p->data);     
      }
       }//Postorder

  
Status InitStack(SqStack &S)
{S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(char));

 if(!S.base) exit(OVERFLOW);

 S.top = S.base;

 S.stacksize = STACK_INIT_SIZE;

 return OK;
}   //InitStack  
int InOrderTraverse(BiTree T,Status(*Visit)(char e)){
    BiTree p;
    SqStack S;
    if(T){

 {InitStack(S);
  p=T;
  while (p||!StackEmpty(S)){
       if(p){PushStack(S,p->data);p=p->lchild;}
       else{
            PopStack(S,p->data);if(!Visit(p->data))return ERROR;
            p=p->rchild;
            }//else
          }//while 
          return OK;
        }//InOrderTraverse
 

int StackEmpty(SqStack S)
{if(S.top==S.base) 
  return TRUE;

 else
  return FALSE;
}//StackEmpty
        
int PushStack(SqStack *S,char e)
{

 
  if(S->top - S->base>=S->stacksize)
   {

     S->base=(SElemType *) realloc(S->base,
        (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
     if(!S->base)exit(OVERFLOW);
     S->top=S->base+S->stacksize;
     S->stacksize += STACKINCREMENT;
   }//PushStack
  

  *(S->top++)=e;
  return OK;
}

int PopStack(SqStack *S,SElemType *e)
{
  if(S->top==S->base) return ERROR;
  *e=*--S->top;
  return OK;
}//PopStack

int main()
{SqStack S;

 InitStack(S);

 char e;

 struct BiTNode *T=0;

 T=CreateBiTree();

 printf("中序遍历:\n");

 Postorder(T);

}  
搜索更多相关主题的帖子: 二叉树 
2012-11-28 17:38
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:8 

#include <malloc.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string>
 #define OVERFLOW -1
 #define ERROR 0
 #define OK 1
 #define STACK_INIT_SIZE 100 //;多了个分号 错误9
 #define STACKINCREMENT 10 // ;
 typedef int Status;
 typedef char TElemType;
 

typedef struct BiTNode{
         char data;
         struct BiTNode *lchild;//左右孩子指针
         struct BiTNode *rchild;
         }BiTNode,*BiTree;

 typedef struct{
  char *base;
   char *top;
   int stacksize;
 }SqStack;
 
int InitStack(SqStack &S);
// int  PopStack(SqStack &S,char *e);
// int PushStack(SqStack &S,char e); 错误1 申明和实现不一样

int  PopStack(SqStack *S,char *e);
 int PushStack(SqStack *S,char e);
 int StackEmpty(SqStack &S);
 void Postorder(BiTNode  *p);
 // int StackEmpty(SqStack S);
   
int CreateBiTree(BiTree &T)
//按先序次序输入二叉树中结点的值,空格字符表示空树
//构造二叉链表表示的二叉树T
 {
    char ch;
   printf("请输入元素:\n");                     
    scanf("%c",&ch);
    if(ch==' ')T=NULL;
    else{
       if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))exit(OVERFLOW);
       T->data=ch;
       CreateBiTree(T->lchild);
       CreateBiTree(T->rchild);
       }
        return OK;
  }//CreateBiTree
   
 void  Postorder( BiTNode  *p)
 {
     if (p!=NULL)
     {
         Postorder( p->lchild );
         Postorder(p->rchild ) ;
         printf("%c",p->data);  
     }
 }//Postorder
 
  
 Status InitStack(SqStack &S)
 {
     // 错误2
     S.base=(char *)malloc(STACK_INIT_SIZE *sizeof(char)); // S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(char)); 类型转换错误
     if(!S.base) exit(OVERFLOW);
     S.top = S.base;
     S.stacksize = STACK_INIT_SIZE;
     return OK;
 }   //InitStack  

 int InOrderTraverse(BiTree T,Status(*Visit)(char e))
 {
     BiTree p;
     SqStack S;
     if(T) // 错误3 { 这个地方多了个 括号
     {
         InitStack(S);
         p=T;
         while (p||!StackEmpty(S)){
             if(p){
                 PushStack(&S,p->data);p=p->lchild;
             }
             else{
                 PopStack(&S,&p->data);if(!Visit(p->data))return ERROR;
                 p=p->rchild;
             }//else
         }//while
         return OK;
     }//InOrderTraverse
 } //// 错误 4 这个地方少了个右括号
 

int StackEmpty(SqStack &S)// // 错误5 这个应该是传地址 不是穿值// int StackEmpty(SqStack S)
 {
     if(S.top==S.base)
         return TRUE;
     else
         return FALSE;
 }//StackEmpty
         
 int PushStack(SqStack *S,char e)
 {

   if(S->top - S->base>=S->stacksize)
    {
        // // 错误7这个地方类型转换类型错了
        // S->base=(SElemType *) realloc(S->base,   (S->stacksize + STACKINCREMENT) * sizeof(SElemType));  
        S->base=(char *) realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(char));
        if(!S->base)
            exit(OVERFLOW);
        S->top=S->base+S->stacksize;
        S->stacksize += STACKINCREMENT;
   }//PushStack
   
   *(S->top++)=e;
   return OK;
 }
 
int PopStack(SqStack *S,char *e)
 {
   if(S->top==S->base) return ERROR;
   *e=*--S->top;
   return OK;
 }//PopStack
 
int main()
 {
     SqStack S;
     InitStack(S);
     char e;
     struct BiTNode *T=0;
     // // 错误8
     // T=CreateBiTree();      
     CreateBiTree(T);
     printf("中序遍历:\n");
     Postorder(T);  
}  

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-11-28 22:25
一个孩子
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:356
专家分:954
注 册:2012-10-1
收藏
得分:8 
你别一下子把所有的代码写完再去找错误,这样会麻烦的。要一个一个功能一个功能的去验证,第一步先把写好的部分验证正确了再往下写,要不然除非你很牛,,会很纠结的

重要的不是结果,是求一个结果的过程,哪怕千难万难,当你有想要的结果时,你已走的很远
2012-11-29 15:19
快速回复:求指导,二叉树创建和遍历那里错了呢。
数据加载中...
 
   



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

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