时间限制: 15 Sec 内存限制: 128 MB
提交: 774 解决: 571
题目描述
从键盘接收扩展先序序列,以二叉链表作为存储结构,建立二叉树。采取非递归方法输出这棵二叉树的先序、中序遍历序列。
样例输入 Copy
ABC##DE#G##F###
样例输出 Copy
ABCDEGF
CBEGDFA
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 100
//节点类型定义
typedef struct Node{
char data;
struct Node* Lchild;
struct Node* Rchild;
}BiTNode, *BiTree;
typedef struct{ //定义栈
BiTNode node[MAX_SIZE];
int top;
}SeqStack;
//初始化栈
void InitStack(SeqStack *S)
{
//S = (SeqStack *)malloc(sizeof(SeqStack));
S->top = -1;
}
//判空栈
int IsEmpty(SeqStack *S)
{
if(S->top == -1)
return 1;
return 0;
}
//进栈
int Push(SeqStack *S, BiTree p)
{
if(S->top == MAX_SIZE-1)
{
return 0;
}
else
{
S->top++;
S->node[S->top] = (*p);
return 1;
}
}
//出栈
int Pop (SeqStack *S, BiTNode *p)
{
if (S->top == -1)
{
return 0;
}
else
{
int c = S->top;
*p = S->node[c];
S->top--;
return 1;
}
}
//取栈顶元素
int Top(SeqStack *S, BiTree p)
{
if(!IsEmpty(S))
return 0;
*p = S->node[S->top];
return 1;
}
//访问节点
void Visit(char p)
{
printf("%c", p);
}
//先序遍历二叉树的非递归实现
void PreOrder(BiTree root)
{
SeqStack S;
BiTree p, q = NULL;
InitStack(&S);
p = root;
while( p != NULL || !IsEmpty(&S))
{
while( p != NULL)
{
Visit(p->data);
Push(&S, p);
q = p;
p = p->Lchild;
}
p = q;
if(!IsEmpty(&S))
{
Pop(&S, p);
p = p->Rchild;
}
}
}
//中序遍历二叉树的非递归实现
void InOrder1(BiTree root)
{
SeqStack S;
BiTree p, q = NULL;
InitStack(&S);
p = root;
while(p != NULL || !IsEmpty(&S))
{
while(p != NULL)
{
Push(&S, p);
q = p;
p = p->Lchild;
}
p = q;
if(!IsEmpty(&S))
{
Pop(&S, p);
Visit(p->data);
p = p->Rchild;
}
}
}
//用扩展先序遍历建立二叉链表
void CreateBiTree(BiTree *root1, BiTree *root2)
{
char ch;
ch = getchar();
if(ch == '#')
{
*root1 = *root2 = NULL;
}
else
{
(*root1) = (BiTree)malloc(sizeof(BiTNode));
(*root1)->data = ch;
(*root2) = (BiTree)malloc(sizeof(BiTNode));
(*root2)->data = ch;
CreateBiTree(&((*root1)->Lchild), &((*root2)->Lchild));
CreateBiTree(&((*root1)->Rchild), &((*root2)->Rchild));
}
}
int main()
{
BiTree root1, root2;
root1 = root2 = NULL;
CreateBiTree(&root1, &root2);
PreOrder(root1);
printf("\n");
InOrder1(root2);
return 0;
}