假设树采用指针方式的孩子表示法表示,试编写一个非递归函数void PreOrder1(tree root),实现树的前序遍历算法。
自建库部分
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define m 3 //这里主要面对3叉树
#define MAXLEN 100
typedef char datatype;
typedef struct node {
datatype data;
int num;
struct node *child[m];
} node;
typedef node *tree;
typedef struct stack{
tree data[100];
int tag[100];
int top;
}seqstack;
void push(seqstack* s,tree t){
s->data[s->top]=t;
s->top++;
}
tree pop(seqstack* s){
if(s->top!=0){
s->top--;
return(s->data[s->top]);
}
else
return NULL;
}
/********************************************************/
/* 函数功能:根据树的前序遍历结果建立一棵3度树 */
/* 函数返回值:树根地址 */
/* 文件名:tree.h,函数名:createtree () */
/********************************************************/
tree createtree()
{/*按前序遍历顺序建立一棵3度树的递归算法*/
int i; char ch;
tree t;
if ((ch=getchar())=='#') t=NULL;
else
{
t=(tree) malloc (sizeof(node));
t->data=ch;
for (i=0;i<m;++i)
t->child[i]= createtree();
}
return t;
}
void preorder(tree t)
{
int i;
if (t)
{
printf("%c",t->data);
for (i=0;i<m;i++)
preorder(t->child[i]);
}
}
void postorder(tree t)
{
int i;
if (t)
{
for (i=0;i<m;i++)
postorder(t->child[i]);
printf("%c",t->data);
}
}
主程序部分`
int main ()
{
tree root;
printf("please input the preorder sequence of the tree:\n");
root =createtree();
printf("前序序列是:\n");
PreOrder1(root);
return 0;
}
实现函数部分
void PreOrder1(tree root)
{
seqstack s;
s.top=0;
while(root!=NULL || s.top!=0){
if(root!=NULL){
printf("%c",root->data);
push(&s,root);
root=root->child[0];
}
else{
int num=s.data[s.top-1]->num;
root=pop(&s);
root->num=num+1;
if(root->num==1){
tree root_1=root;
root=root->child[1];
push(&s,root_1);
}
else
root=root->child[2];
}
}
}