#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
typedef char TElemType;
typedef struct BiNode{
TElemType date;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
typedef struct{
TElemType *base,*top;
int StackSize;
}Stack;
InitTree(BiTree *t)
{
*t=NULL;
}
InitStack(Stack *s)
{
s->base=(TElemType*)malloc(sizeof(TElemType)*MAXSIZE);
if(!s->base) exit(-1);
s->top=s->base;
s->StackSize=MAXSIZE;
}
int Creat(BiTree *t)
{
TElemType ch;
scanf("%c",&ch);
if(ch!='#'){
(*t)=(BiNode*)malloc(sizeof(BiNode));
(*t)->date=ch;
Creat(&(*t)->lchild);
Creat(&(*t)->rchild);
}
else *t=NULL;
}
int visit(BiTree t)//遍历
{
if(t!=NULL) printf("%c ",t->date);
return 0;
}
int Push(Stack **s,BiNode *p)
{
if((*s)->top-(*s)->base==(*s)->StackSize){
printf("栈满,入栈失败!");
return 0;
}
*(*s)->top++=p;
}
int Pop(Stack **s)
{
if((*s)->top-(*s)->base==0){
printf("栈空,出栈失败!");
return 0;
}
return *(*s)->top--;
}
int InTraverse(BiTree t,Stack *s)
{
while(s->top-s->base!=0&&t!=NULL)
if(t!=NULL){
Push(&(*s),t);
t=t->lchild;
}
else{
t=Pop(&(*s));
visit(t);
t=t->rchild;
}
}
int main()
{
BiTree T;
Stack S;
InitTree(&T);
InitStack(&S);
Creat(&T);
printf("\n中序遍历的非递归算法:");
InTraverse(T,&S);
}
二叉树的中序非递归遍历
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 快乐鹦鹉 2022-08-16 19:57关注
改好了,主要问题还是在push函数,不能将top指向树节点,因为堆栈有自己的内存空间,只能进行内容复制
其它也有不少问题#include<stdio.h> #include<stdlib.h> #define MAXSIZE 20 typedef char TElemType; typedef struct BiNode{ TElemType date; struct BiNode *lchild,*rchild; }BiNode,*BiTree; typedef struct{ BiNode *base,*top; int StackSize; }Stack; void InitTree(BiTree *t) { *t=NULL; } void InitStack(Stack *s) { s->base=(BiNode*)malloc(sizeof(BiNode)*MAXSIZE); if(!s->base) exit(-1); s->top=s->base; s->StackSize=MAXSIZE; } int Creat(BiTree *t) { TElemType ch; scanf("%c",&ch); if(ch!='#'){ (*t)=(BiNode*)malloc(sizeof(BiNode)); (*t)->lchild = NULL; (*t)->rchild = NULL; (*t)->date=ch; Creat(&(*t)->lchild); Creat(&(*t)->rchild); } else *t=NULL; return 0; } int visit(BiTree t)//遍历 { if(t!=NULL) printf("%c ",t->date); return 0; } int Push(Stack **s,BiNode *p) { if((*s)->top-(*s)->base==(*s)->StackSize){ printf("栈满,入栈失败!"); return 0; } (*s)->top++; (*s)->top->date = p->date; (*s)->top->lchild = p->lchild; (*s)->top->rchild = p->rchild; return 1; } BiNode* Pop(Stack **s) { if((*s)->top-(*s)->base==0){ printf("栈空,出栈失败!"); return 0; } BiNode * p= (*s)->top; (*s)->top--; return p; } int InTraverse(BiTree t,Stack *s) { while((s->top-s->base!=0) || t!=NULL) { if(t!=NULL){ Push(&s,t); t=t->lchild; } else{ t=Pop(&s); visit(t); t=t->rchild; } } return 1; } int main() { BiTree T; Stack S; InitTree(&T); InitStack(&S); Creat(&T); printf("\n中序遍历的非递归算法:"); InTraverse(T,&S); }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 mmo能不能做客户端怪物
- ¥15 osm下载到arcgis出错
- ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
- ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
- ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
- ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?
- ¥15 QQ邮箱过期怎么恢复?
- ¥15 登录他人的vue项目显示服务器错误
- ¥15 (标签-android|关键词-app)
- ¥15 comsol仿真压阻传感器