| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3537 人关注过本帖
标题:【求调试找错】先序遍历的递归算法和中序遍历二叉树的非递归算法的C语言实现 ...
只看楼主 加入收藏
听潮
Rank: 2
等 级:论坛游民
帖 子:18
专家分:10
注 册:2016-4-21
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
【求调试找错】先序遍历的递归算法和中序遍历二叉树的非递归算法的C语言实现(总是程序停止运行)
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW 1
#define OK 0
#define ERROR 1
typedef struct BiTNode{
    int data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct{
    BiTree *base;
    BiTree *top;
    int stacksize;
}SqStack;
void InitBiTree(BiTree &T){
    T=NULL;
}
int CreateBiTree(BiTree &T){
    int c;
    scanf("%d",&c);
    if(c==0) T=NULL;
    else{
        if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
        exit(OVERFLOW);
        T->data=c;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}

int printelemt(int e){
    printf("%d",e);
    return OK;
}
int PreorderTraverse(BiTree T,int(*visit)(int e)){
    if(T){
        visit(T->data);
        PreorderTraverse(T->lchild,visit);
        PreorderTraverse(T->rchild,visit);
        
    }
}
int InitStack(SqStack &S){
    S.base=(BiTree*)malloc(STACK_INIT_SIZE*sizeof(BiTree));
    if(!S.base) exit(OVERFLOW);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}
int Push(SqStack &S,BiTree e){
    if(S.top-S.base>=S.stacksize){
        S.base=(BiTree*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(BiTree));
        if(!S.base)
        printf("OVERFLOW");
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top++=e;
}
int Pop(SqStack &S,BiTree &e){
    if(S.top == S.base)  
    return ERROR;  
    e =*--S.top;  
    return OK;  
}
int StackEmpty(SqStack &S)  
{  
if(S.top == S.base)  
return OK;  
else  
return ERROR;  
}  
int InorderTraverse(BiTree T,int(*visit)(int e)){
    SqStack S;
    InitStack(S);
    BiTree P=T;
    while(P||!StackEmpty(S)){
    SqStack S;
    InitStack(S);
    BiTree p;
    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;
    InitBiTree(T);
    CreateBiTree(T);
    PreorderTraverse(T,printelemt);
    printf("\n");
    InorderTraverse(T,printelemt);
}   
收到的鲜花
搜索更多相关主题的帖子: include 二叉树 C语言 
2016-04-21 08:59
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:20 
程序代码:
int InorderTraverse(BiTree T, int (*visit)(int e))
{
    SqStack S;
    InitStack(S);
    BiTree p;
    p = T;
    while (p || (StackEmpty(S) == ERROR))
    {
        if (p)
        {
            Push(S, p);
            p = p->lchild;
        }
        else
        {
            Pop(S, p);
            if (visit(p->data) != OK) return ERROR;
            p = p->rchild;
        }
    }
    return OK;
}

if 条件不要乱用!
都是错的


[fly]存在即是合理[/fly]
2016-04-22 09:53
听潮
Rank: 2
等 级:论坛游民
帖 子:18
专家分:10
注 册:2016-4-21
收藏
得分:0 
回复 2楼 azzbcc
可是这是按照书上给出的来的,也不知道为什么错的==
2016-04-22 23:46
zhulei1978
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
收藏
得分:0 
你看的是啥书,跟我看的不一样

Status InOrderTraverse(BiTree T,Status( *Visit)(TElemType e)){
 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);
  }
 }
return OK;
}


[此贴子已经被作者于2016-4-23 17:24编辑过]


其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-04-23 06:46
zhulei1978
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
收藏
得分:0 
中序遍历二叉树的另一种非递归算法

Status InOrderTraverse(BiTree T,Status( *Visit)(TElemType e)){
 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;
}

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-04-23 06:51
听潮
Rank: 2
等 级:论坛游民
帖 子:18
专家分:10
注 册:2016-4-21
收藏
得分:0 
回复 4楼 zhulei1978
你写的是树上第一种非递归算法,我写的是第二种,但是两种我都试过,可以运行,但输入结果后出现程序错误
2016-04-23 18:36
听潮
Rank: 2
等 级:论坛游民
帖 子:18
专家分:10
注 册:2016-4-21
收藏
得分:0 
回复 2楼 azzbcc
多谢,用你的是可以得出结果的,树上出问题了,老师和我们说了
2016-04-23 18:41
快速回复:【求调试找错】先序遍历的递归算法和中序遍历二叉树的非递归算法的C语 ...
数据加载中...
 
   



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

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