非递归实现二叉树的遍历
2011-12-06 18:04
423 查看
这个算法很早开始写了,在机房时也出来了,没有报错,没有警告。可就是实现不了输出。我分析了下,可能是函数调用出了错。一直没有在看了,直到昨天看到同学都早就将图的深度和广度优先遍历算法写完了。这才记起来了。同学看了我的程序,觉得我写的太复杂了,说为什么要单独的用函数实现呢?直接写在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;
}
}
}
函数里面很简单实现,为什么不放在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;
}
}
}
相关文章推荐
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 二叉树先序,中序,后序遍历非递归实现
- Java方式实现二叉树的前中后序遍历的递归及非递归算法
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 遍历中序C语言实现二叉树的递归遍历与非递归遍历
- C++编程练习(17)----“二叉树非递归遍历的实现“
- 二叉树的遍历(非递归实现)
- 数据结构---二叉树的前序、中序、后序遍历的递归和非递归 实现(C++)
- Java实现二叉树的前序、中序、后序遍历(非递归方法)
- 二叉树--实现二叉树的前序/中序/后序非递归遍历。
- 从递归的异同分析二叉树先序、中序、后序遍历共同流程并实现非递归方式的三种遍历。
- LeetCode算法题集-144. Binary Tree Preorder Traversal(二叉树的前序遍历,不用递归实现)
- 二叉树相关操作(前序遍历,中序遍历,后序遍历,层次序遍历等)递归和非递归实现
- 二叉树三种遍历递归及非递归实现
- 数据结构——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树的遍历(非递归实现)
- c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历
- 前中后序遍历二叉树的非递归实现
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 【基础题】--实现二叉树的前序 / 中序 / 后序非递归遍历