先序遍历:
算法思想:从根结点开始,若当前结点存在或不为空,可重复操作一下两步:
(1)访问当前结点,当前结点进栈,访问其左子树,左子树不为空一直访问进栈,直到左子树为空;
(2)若栈非空,则退栈顶结点,访问其右子树。
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef char DataType;
typedef struct Node
{
DataType data;
struct Node * Lchild;
struct Node * Rchild;
} BiTNode,*BiTree;
typedef BiTree DataType1;
typedef struct
{
DataType1 data1[MAXSIZE];
int top;
}SeqStack;
void InitStack(SeqStack **s)//置空栈
{
(*s)=(SeqStack *)malloc(sizeof(SeqStack));
(*s)->top=-1;
}
int StackEmpty(SeqStack *s)//判空栈
{
if(s->top==-1)
return 1;
else
return 0;
}
int Push(SeqStack *s,DataType1 x)//入栈
{
if(s->top==MAXSIZE-1)
return 0;
else
{
s->top++;
s->data1[s->top]=x;
return 1;
}
}
int Pop(SeqStack *s,DataType1 *x)//出栈
{
if(StackEmpty(s)) return 0;
else
{
*x=s->data1[s->top];
s->top--;
return 1;
}
}
void CreateBiTree(BiTree *root)
{
char ch;
ch=getchar();
if(ch=='^')
*root=NULL;
else
{
*root=(BiTree)malloc(sizeof(BiTNode));
(*root)->data=ch;
CreateBiTree(&((*root)->Lchild));
CreateBiTree(&((*root)->Rchild));
}
}
void PreOrder(BiTree root)
{
SeqStack *S;
BiTree p;
InitStack(&S);
p=root;
while(p||!StackEmpty(S))
{
while(p)
{
printf("%c",p->data);
Push(S,p);
p=p->Lchild;
}
if(!StackEmpty(S))
{
Pop(S,&p);
p=p->Rchild;
}
}
}
int main(void)
{
BiTree root;
root=(BiTree)malloc(sizeof(BiTNode));
CreateBiTree(&root);
PreOrder(root);
}
扫描二维码关注公众号,回复:
2593723 查看本文章