| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1053 人关注过本帖
标题:二叉树的非递归遍历请高手检查错误
只看楼主 加入收藏
qq8801103
Rank: 5Rank: 5
来 自:苏州中科大软件学院
等 级:职业侠客
威 望:1
帖 子:422
专家分:340
注 册:2009-10-8
结帖率:73.96%
收藏
已结贴  问题点数:10 回复次数:9 
二叉树的非递归遍历请高手检查错误
#include <stdio.h>
#define STACKINITSIZE 100
#define STACK 10
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef struct
{
   char *base;
   char *top;
   int stacksize;
}Sqstack;
typedef struct BiTNode
{
  char data;
  struct BiTNode  *lchild,*rchild;
}BiTNode,*BiTree;
char Initstack(Sqstack *S)
{
   S->base=(char *)malloc(STACKINITSIZE*sizeof(char));
   if(!S->base) exit(OVERFLOW);
   S->top=S->base;
   S->stacksize=STACKINITSIZE;
   return OK;
}
char GetTop(Sqstack S,char *e)
{
   if(S.top==S.base)  return ERROR;
   *e=*S.top-1;
   return *e;
}
char Push(Sqstack *S,char *e)
{
  if(S->top-S->base>=S->stacksize)
  {
    S->base=(char *)realloc(S->base,(S->stacksize+STACK)*sizeof(char));
    if(!S->base) exit(OVERFLOW);
    S->top=S->base+S->stacksize;
    S->stacksize+=STACK;
  }
  *S->top++=*e;
  return *e;
}
char Pop(Sqstack *S,char *e)
{
   if(S->top==S->base) return ERROR;
   *e=*--S->top;
   return *e;
}
print(char e)
{
   printf("%c",e);
   return 1;
}
char Inorder(BiTree T,int(* Visit)(char e))
{
  Sqstack S;BiTree p;
  Initstack(&S);   Push(&S,T);
  while(!stackempty(&S))
  {
     while(GetTop(S,p)&&p) Push(&S,p->lchild);
     Pop(&S,p);
     if(!stackempty(&S))
     {
    Pop(&S,p);
    if(!Visit(p->data)) return ERROR;
    Push(&S,p->rchild);
     }
  }
}
stackempty(Sqstack *S)
{
  if(S->top==S->base) return 1;
  else
    return 0;
}
char CreateBiTree(BiTree T)
{
  char ch;
  ch=getchar();
  if(ch=='#') T=NULL;
  else
  {
    if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
    T->data=ch;
    CreateBiTree(T->lchild);
    CreateBiTree(T->rchild);
  }
  return OK;
}
main()
{
BiTree S1;
CreateBiTree(&S1);
Inorder(&S1,print);
}
搜索更多相关主题的帖子: 二叉树 遍历 递归 检查 
2010-05-12 11:53
hzh512
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:234
专家分:1333
注 册:2009-6-5
收藏
得分:2 
你的程序很奇怪,让我很不明白的是 栈指针怎么会是char*类型,让我很不解,也无法给你改动。
因为一动数据结构,你的整个程序都要动,还不如另写一个呢!

编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
2010-05-12 14:21
qq8801103
Rank: 5Rank: 5
来 自:苏州中科大软件学院
等 级:职业侠客
威 望:1
帖 子:422
专家分:340
注 册:2009-10-8
收藏
得分:0 
那就请你给我写一个  谢谢

Discuz!  
好好学习  天天向上
2010-05-13 22:17
鬼鬼千年
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:39
专家分:140
注 册:2010-4-9
收藏
得分:2 
我写了一小半了,可是要停电了,明天接着写

活了千年的鬼鬼,突然想当个人,看看人和鬼哪个好?
2010-05-13 23:17
LegendofMine
该用户已被删除
收藏
得分:2 
提示: 作者被禁止或删除 内容自动屏蔽
2010-05-14 10:10
LegendofMine
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-05-14 10:11
鬼鬼千年
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:39
专家分:140
注 册:2010-4-9
收藏
得分:0 
声明:只是很粗的改了一遍,编译通过了,还没有调试
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define SIZE 20
#define STACK 10
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define elemtype   char
typedef struct
{
   elemtype data[SIZE];
   int top;
}Sqstack;

typedef struct BiTNode
{
  char data;
  struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void  Initstack(Sqstack &s)//初始化堆栈
{
   
   s.top=-1;
}

char GetTop(Sqstack s,elemtype e)
{
   if(s.top==-1)  return ERROR;
   else
   {
       e=s.data[s.top];
       return e;
   }
}


void push(Sqstack s,elemtype e)
{
  if(s.top==SIZE-1)
       printf("zhan man");
  else
  {
      s.top++;
      s.data[s.top]=e;
  }
   
}
char pop(Sqstack s,elemtype &e)
{
   if(s.top==-1)  return ERROR;
   else
   {
       e=s.data[s.top];
       s.top--;
       return e;
   }
}
 void print(char e)
{
   printf("%c",e);
  
}
 
 int stackempty(Sqstack s)
{
  if(s.top==-1) return 1;
  else
    return 0;
}
void Inorder(BiTree T)
{
  Sqstack s;
   BiTree T1;
   T1=T;
   char p;
  p=T1->data;
  Initstack(s);   
  push(s,T1->data);
  while(T1||!stackempty(s))
  {
      if(T1)
      {
          push(s,T1->data);
          T1=T1->lchild;
      }
      else
      {
          pop(s,T1->data);
          print(T1->data);
          T1=T1->rchild;
      }
   
   }
  
}

char CreateBiTree(BiTree T)
{
  char ch;
  ch=getchar();
  if(ch=='#') T=NULL;
  else
  {
    if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
    T->data=ch;
    CreateBiTree(T->lchild);
    CreateBiTree(T->rchild);
  }
  return OK;
}
  int main()
{
BiTree S1;
CreateBiTree(S1);
Inorder(S1);
return 0;

}

活了千年的鬼鬼,突然想当个人,看看人和鬼哪个好?
2010-05-14 13:16
qq8801103
Rank: 5Rank: 5
来 自:苏州中科大软件学院
等 级:职业侠客
威 望:1
帖 子:422
专家分:340
注 册:2009-10-8
收藏
得分:0 
7楼的我怎么编译不通过呢  能否用c  写个  写谢谢

Discuz!  
好好学习  天天向上
2010-05-14 19:24
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:2 
#define STACK_INIT_SIZE 100
#define STACKINCREMENT  10
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;

//////////////////////////////////////////////栈定义
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild;//
}BiTNode,*BiTree;
typedef struct
{
    BiTree *base;
    BiTree *top;
    int stacksize;
}SqStack;


//////////////////////////////////////////////队列定义
typedef struct QNode
{
    BiTree data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;


/////////////////////////////////////////////栈的基本操作
void initialStack(SqStack *s)
{
    s->base=(BiTree *)malloc(STACK_INIT_SIZE*sizeof(BiTree));
    if(!s->base) exit(0);
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
}
void Push(SqStack *s,BiTNode *e)
{
    if(s->top-s->base>=s->stacksize)
    {
        s->base=(BiTree *)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(BiTree));
        if(!s->base) exit(0);
        s->top=s->base+s->stacksize;
        s->stacksize+=STACKINCREMENT;
    }
    *(s->top)++=e;
}
void Pop(SqStack *s,BiTree *e)//////////////////
{
    if(s->top==s->base) exit(0);
    *e=*--(s->top);//
}
int GetTop(SqStack *s,BiTree *e)///////////////////
{
    if(s->top==s->base) return(0);
    *e=*(s->top-1);//
    return(1);
}
int StackEmpty(SqStack *s)
{
    if(s->base==s->top)
        return(1);
    else
        return(0);
}

BiTree CreatBiTree()//先序建立二叉链表
{
    TElemType ch;
    BiTree T;
    scanf("%c",&ch);
    if(ch=='@')
        T=NULL;
    else
    {
        T=(BiTree)malloc(sizeof(BiTNode));
        if(!T)
            exit(0);
        T->data=ch;
        T->lchild=CreatBiTree();
        T->rchild=CreatBiTree();
    }
    return T;//返回结点(T->data,T->lchild,T->rchild三个值已经确定)的指针的值
}

void Visit(BiTree p)//对数据元素进行操作的Visit函数
{
    printf("%c",p->data);
}
void InOrderTraverse(BiTree T)
{
    SqStack S;
    BiTree p;
    initialStack(&S);
    p=T;
    while(p||!StackEmpty(&S))
    {
        if(p)//根指针进栈,遍历左子树
        {
            Push(&S,p);
            p=p->lchild;
        }
        else//根指针退栈,访问根节点,遍历右子树
        {
            Pop(&S,&p);//Pop(&S,p) is incomptible
            Visit(p);
            p=p->rchild;
        }
    }
}

void AfterTraverse(BiTree T)//后序遍历
{
    SqStack S;
    BiTree p;
    initialStack(&S);
    do
    {
        while(T)//从左走到尽
        {
            Push(&S,T);
            T=T->lchild;
        }
        p=NULL;
        while(!StackEmpty(&S))
        {
            GetTop(&S,&T);
            if(T->rchild==p)//该结点的//右儿子\\为*空*或者*已经访问过*的结点,则访问根结点
            {
                Pop(&S,&T);
                Visit(T);
                p=T;//key point
            }
            else//否则,不要取出根结点,把它的右儿子的值找到,访问右子树
            {
                T=T->rchild;
                break;//退出内循环,进入下一层外循环
            }
        }
    }
    while(!StackEmpty(&S));
}
/////////////////////////////////
void main()
{
    BiTree t;
    printf("请按先序遍历序列输入二叉树中各个结点的值(字符),若为空树时输入空格键:\n");
    printf("<参考数据为:abc@@de@g@@f@@@,输完后再输入一个回车键.>\n");
    t=CreatBiTree();
    printf("[中序遍历]:\n");
    InOrderTraverse(t);
    printf("\n");
}
2010-05-14 19:32
LegendofMine
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-05-15 21:49
快速回复:二叉树的非递归遍历请高手检查错误
数据加载中...
 
   



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

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