| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 577 人关注过本帖
标题:关于C语言 先序递归建立二叉树和中序非递归遍历二叉树的问题,无法执行啊! ...
只看楼主 加入收藏
cuilunan1994
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-11-1
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
关于C语言 先序递归建立二叉树和中序非递归遍历二叉树的问题,无法执行啊!!!
#include <stdio.h>
#include <stdlib.h>
#define STACKINCREMENT 10
#define ok 1
#define error 0
#define STACK_INIT_SIZE 100
#define SElemType BiTree
#define TElemType char
#define Status int
typedef struct BiTNode{
    TElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;


typedef struct{
    SElemType *base,*top;
    int stacksize;
}Sqstack;


Status Visit(TElemType e)
{
    printf("%c\t",e);
    return ok;
}


Status CreateBiTree(BiTree *T)
{
    TElemType ch;
    scanf("%c",&ch);
    if(ch=='#')
    *T=NULL;
    else
    {
        if(!(*T=(BiTree)malloc(sizeof(BiTNode))))
        {
            printf("存储分配出错!\n");
            exit(1);
        }
        (*T)->data=ch;
        CreateBiTree(&((*T)->lchild));
        CreateBiTree(&((*T)->rchild));
    }
    return ok;
}




Status InitStack(Sqstack *s)
{
    (*s).base=(SElemType*)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
    (*s).top=(*s).base;
    (*s).stacksize=STACK_INIT_SIZE;
    return ok;
}



Status StackEmpty(Sqstack *s)
{
    if((*s).top==(*s).base)
        return ok;
    else
        return error;
}



Status push(Sqstack *s,SElemType e)
{
    if ((*s).top-(*s).base>=(*s).stacksize)
        (*s).base=(SElemType*)realloc((*s).base,((*s).stacksize+STACKINCREMENT)*sizeof(SElemType));
    if(!((*s).base))
    {
        printf("存储分配出错!\n");
        exit(1);
    }
    (*s).top=(*s).base+(*s).stacksize;
    (*s).stacksize+=STACKINCREMENT;
    *((*s).top++)=e;
    return ok;
}


Status Pop(Sqstack *s,SElemType *e)
{
    if((*s).top==(*s).base)
        return error;
    *e=*--(*s).top;
    return ok;
}


Status InOrderTraverse(BiTree T,Status(*Visit)(TElemType e))
{
    BiTree p; Sqstack s;
    InitStack(&s);
    p=T;
    while(p||!StackEmpty(&s))
    {
        if(p)
        {
            push(&s,p);p=p->lchild;
        }
        else
        {
            Pop(&s,&p);
            if(!Visit(p->data))
            return error;
            p=p->rchild;
        }
    }
 
   return ok;
   
}




int main()
{
    BiTree T;
    printf("请用先序顺序输入二叉树数据:\n");
    CreateBiTree(&T);
    printf("中序非递归遍历二叉树显示如下:\n");
    InOrderTraverse(T,Visit);
    return 0;
}

运行后输入AB##C##,按说应该显示B A C才对,可是显示出错:只能显示出B然后报错,怎么回事啊,调了好几天了都没弄好,谁帮我解决下啊。。。。









            
搜索更多相关主题的帖子: include return 二叉树 C语言 
2013-11-01 18:21
又一轮明月
Rank: 2
等 级:论坛游民
帖 子:13
专家分:50
注 册:2013-10-31
收藏
得分:0 
你这个算法我没看懂!为什么先序,后序,中序遍历你不用递归
2013-11-01 20:28
rchunjiang
Rank: 4
来 自:大连
等 级:业余侠客
帖 子:42
专家分:262
注 册:2013-10-25
收藏
得分:0 
应该是压栈和出栈的时候出了问题,我再帮你看看
2013-11-01 20:38
rchunjiang
Rank: 4
来 自:大连
等 级:业余侠客
帖 子:42
专家分:262
注 册:2013-10-25
收藏
得分:20 
下面这个地方有问题
程序代码:
Status push(Sqstack *s,SElemType e)

 {
     if ((*s).top-(*s).base>=(*s).stacksize)
     {
         (*s).base=(SElemType*)realloc((*s).base,((*s).stacksize+STACKINCREMENT)*sizeof(SElemType));
         /******************************更正*************************************/
        (*s).top=(*s).base+(*s).stacksize;
        (*s).stacksize+=STACKINCREMENT;
     }
     if(!((*s).base))
     {
         printf("存储分配出错!\n");
         exit(1);
     }
     /*********************一下两句位置错了****************************/

 //    (*s).top=(*s).base+(*s).stacksize;

 //    (*s).stacksize+=STACKINCREMENT;
     *((*s).top++)=e;
     return ok;

 }
改了就是你说的结果。
2013-11-01 21:33
cuilunan1994
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-11-1
收藏
得分:0 
回复 4楼 rchunjiang
哦哦对对,我没注意,看半天没看出来,太感谢你了!!
2013-11-01 22:56
rchunjiang
Rank: 4
来 自:大连
等 级:业余侠客
帖 子:42
专家分:262
注 册:2013-10-25
收藏
得分:0 
回复 5楼 cuilunan1994
不客气
2013-11-01 23:08
快速回复:关于C语言 先序递归建立二叉树和中序非递归遍历二叉树的问题,无法执 ...
数据加载中...
 
   



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

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