#题目描述**
从键盘接收扩展先序序列,以二叉链表作为存储结构,建立二叉树。采取非递归方法输出这棵二叉树的先序、中序遍历序列。
##样例输入
ABC##DE#G##F###
##样例输出
ABCDEGF
CBEGDFA
代码实现:
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct node{
char data;
struct node *Lc;
struct node *Rc;
}BeTree,*BiTree;
typedef struct {
BiTree data[MAX];
int top;
}SeqDtack;
void Creat(BiTree *root)
{
char ch;
ch = getchar();
if(ch == '#')
*root = NULL;
else
{
(*root) = (BiTree)malloc(sizeof(BeTree));
(*root)->data = ch;
Creat(&((*root)->Lc));
Creat(&((*root)->Rc));
}
}
//初始化栈
SeqStack * InitStack(SeqStack *s)
{
s = (SeqStack *)malloc(sizeof(SeqStack));
s->top = -1;
return s;
}
//判空
int IsEmpty(SeqStack *s)
{
if(s->top == -1) return 1;
else
return 0;
}
//进栈
int Push(SeqStack *s,BiTree p)
{
if(s->top == MAX-1) return 0;
else
{
s->top++;
s->data[s->top] = p;
}
}
//出栈
BiTree Pop(SeqStack *s,BiTree p)
{
if(s->top == -1) return NULL;
rlse
{
p = s->data[s-?top];
s->top--;
return p;
}
}
//访问
void visit(char p)
{
printf("%c",p);
}
//先序
void PreOrder(BiTree root)
{
SeqStack *s;
BiTree p;
s = InitStack(s);
p = root;
while(p != NULL || !IsEmpty(s))
{
while(p != NULL)
{
visit(p->data);
Push(s,p);
p = p->Lc;
}
if(!IsEmpty(s))
{
p=Pop(s,p);
p=p->Rc;
}
}
}
//中序
void InOrder(BiTree root)
{
SeqStack *s;
BiTree p;
s = InitStack(s);
p = root;
while(p != NULL || !IsEmpty(s))
{
while(p != NULL)
{
Push(s,p);
p = p->Lc;
}
if(!IsEmpty(s))
{
p=Pop(s,p);
visit(p->data);
p = p->Rc;
}
}
}
int main()
{
BiTree root;
Creat(&root);
PreOrder(root);
printf("\n");
InOrder(root);
return 0;
}