//第九章第17题;用非递归算法设计先序遍历二叉树;
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#define N 15 //需要设置栈的最大值,若二叉树深度为四,则设置2^4-1=15;
#define maxsize 15 //本程序根据书本p194,图9-8,输入数据为ABCDEFG@@@@L@@@#,输出为先序排列:ABDECFLG;
typedef char datatype;
typedef struct node
{
datatype data;
struct node *lchild,*rchild;
}bitree;
bitree *root;
bitree * CreatTree(void)
{
char ch;
bitree * Q[maxsize];
int front,rear;
bitree *root,*s;
root=NULL;
front=1;
rear=0;
printf("请输入字符构造二叉树,#结束,@表示虚结点./n");
while((ch=getche())!='#')
{
s=NULL;
if(ch!='@')
{
s=(bitree*)malloc(sizeof(bitree));
s->data=ch;
s->lchild=NULL;
s->rchild=NULL;
}
rear++;
Q[rear]=s;
if(rear==1)
root=s;
else
{
if(s&&Q[front])
if(rear%2==0)
Q[front]->lchild=s;
else
Q[front]->rchild=s;
if(rear%2==1)
front++;
}
}
printf("创建二叉树完成.../n");
return root;
}
bitree *stack[N];
void preorder(bitree*p)
{
printf("本函数实现的是先序非递归排列./n");
bitree *s;
int top;
if(p!=NULL)
{
top=-1;
s=p;
while((top!=-1)||(s!=NULL))
{
while(s!=NULL)
{
if(top==N-1)
{
printf("上溢/n");
return;
}
else
{
top++;
printf("%c",s->data); //与中序不同在于printf的位置要在进行左子树遍历之前;
stack[top]=s;
s=s->lchild;
}
}
s=stack[top];
top--;
// printf("%c",s->data);原来中序遍历的时候printf的位置;
s=s->rchild;
// printf("%c",s->data);加在这为后序遍历;
}
}
return;
}
int main()
{
root=CreatTree();
preorder(root);
return 0;
}