#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define M 3
#define MAX 300
FILE*rf;
void open(){
rf=fopen("tree.txt","r");
}
void off(){
fclose(rf);
}
void in(char *ch){
fscanf(rf,"%c",ch);
}
//以上为了输入方便,定义从文件输入一棵树
typedef struct node
{
char data;
struct node*child[M];
}tnode,*tree;
tree creat()//递归先序创建一棵树
{
char ch;tree t;
in(&ch);
if(ch=='#')t=NULL;
else
{
t=(tnode*)malloc(sizeof(tnode));
t->data=ch; int i;
for(i=0;i<M;i++)
t->child[i]=creat();
}
return t;
}
void StackPreorder(tree t)//非递归前序遍历树
{
tree stack[MAX];
int istack[MAX];//保存当前栈顶树访问到了那一颗子树
int top=0;
while(top||t)
{
if(t)
{
printf("%c ",t->data);
stack[top]=t;//该树入栈,保存
istack[top++]=1;//记录下一次应该是访问到第2棵树
t=t->child[0];//先访问第一棵子树
}
else if(istack[top-1]<M)//访问它的下一个兄弟
t=stack[top-1]->child[istack[top-1]++];
else --top;//退栈
}
}
void StackPostorder(tree t)//非递归后序遍历树
{
tree stack[MAX];
int istack[MAX],top=0;
while(top||t)
{
if(t)
{
stack[top]=t;
istack[top++]=1;
t=t->child[0];
}
else if(istack[top-1]<M)//继续下一个兄弟
t=stack[top-1]->child[istack[top-1]++];
else {
printf("%c ",stack[--top]->data);//出栈
t=NULL;//访问置空
}
}
}
void LevelOrder(tree t)
{
tree queue[MAX];
int front=0,rear=0,i;
if(t)queue[rear++]=t;
while(front<rear)
{
t=queue[front++];//输出队首信息,出队
printf("%c ",t->data);
for(i=0;i<M;i++)
if(t->child[i])//如果子树存在,入队
queue[rear++]=t->child[i];
}
}
int Equal(tree a,tree b)
{
if(!a&&!b)//都为空,则相等
return 1;
if(a&&b)
{
if(a->data!=b->data)return 0;//数据不同,则树不同
int i;
for(i=0;i<M;i++)//只要有一颗子树不同,则不同
if(!Equal(a->child[i],b->child[i]))
return 0;
return 1;//子树全同,相同
}
return 0;//其他不同
}
int main()
{
open();
//ABD#####C###E##F#GH###I#####
tree t=creat();
LevelOrder(t);
printf("\n");
StackPreorder(t);
off();
}
普通树的非递归遍历
最新推荐文章于 2022-09-28 20:10:17 发布