这个算法很早开始写了,在机房时也出来了,没有报错,没有警告。可就是实现不了输出。我分析了下,可能是函数调用出了错。一直没有在看了,直到昨天看到同学都早就将图的深度和广度优先遍历算法写完了。这才记起来了。同学看了我的程序,觉得我写的太复杂了,说为什么要单独的用函数实现呢?直接写在main函数里面不更好。班上的一位技术很好的同学也说“编写程序有时候不要太纠结于细节,否则会很痛苦的”,我听后觉得也是,就是因为这个非递归遍历二叉树的程序,让我裹足不前,不敢轻易写算法程序,因为没有信心和勇气了。将同学的代码拷过来,发现有时候,真的,放在main 函数里面很简单实现,为什么不放在main函数里面呢?
用非递归实现二叉树的遍历实现代码:
#include <iostream.h>
#include <malloc.h>
#define arrey 10
#define sorry 10
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct{
BiTree *base;
BiTree *top;
int stacksize;
}sqstack;
int creatBiTree(BiTree &T)//先序创建二叉树
{
char ch;
cin>>ch;
if(ch=='*') T=NULL;
else{
if(!(T=(BiTree)malloc(sizeof(BiTNode)))) return 0;
T->data=ch;
creatBiTree(T->lchild);
creatBiTree(T->rchild);
}
return 1;
}
int Initstack(sqstack &s)
{
s.base=(BiTree*)malloc(arrey*sizeof(BiTree));
if(!s.base) return 0;
s.top=s.base;
s.stacksize=arrey;
return 1;
}
int push(sqstack &s,BiTree e)
{
if(s.base-s.top>=s.stacksize)
{
s.base=(BiTree*)realloc(s.base,(s.stacksize+sorry)*sizeof(BiTree));
if(!s.base) return 0;
s.top=s.base+s.stacksize;
s.stacksize+=sorry;
}
*s.top++=e;
return 1;
}
int pop(sqstack &s,BiTree &e)
{
if(s.top==s.base) return 0;
e=*--s.top;
return 1;
}
void main()
{
sqstack s;
BiTree p;
Initstack(s);
cout<<"先序创建二叉树,没有子树时用*表示!\n";
creatBiTree(p);
/*下面对二叉树进行中序遍历*/
while(p||!(s.top==s.base))
{
if(p){
push(s,p);
p=p->lchild;}
else {
pop(s,p);
cout<<(p->data)<<" ";
p=p->rchild;
}
}
}