非递归实现二叉树的遍历

 这个算法很早开始写了,在机房时也出来了,没有报错,没有警告。可就是实现不了输出。我分析了下,可能是函数调用出了错。一直没有在看了,直到昨天看到同学都早就将图的深度和广度优先遍历算法写完了。这才记起来了。同学看了我的程序,觉得我写的太复杂了,说为什么要单独的用函数实现呢?直接写在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;
		}
	}
}

非递归实现二叉树的遍历_第1张图片

非递归实现二叉树的遍历_第2张图片

你可能感兴趣的:(算法,struct)