麻烦大家帮忙看一个程序~C的 想要知道下这个程序的编程思想 想要详尽的注释~~

来源:百度知道 编辑:UC知道 时间:2024/06/28 02:41:18
#include <stdio.h>
#include <malloc.h>
#define maxsize 1024
#define null 0
struct node
{int data;
struct node *lchild, *rchild;
};
struct node *root;

struct node *CREATREE()
{char ch;
struct node *Q[maxsize];
int front,rear;
struct node *root,*s;
root=null;
front=1;rear=0;
while((ch=getchar())!='#')
{s=null;
if(ch!=' ')
{s=malloc(sizeof(struct node));
s->data=ch;
s->lchild=null;
s->rchild=null;
}
rear++;
Q[rear]=s;
if(rear==1) root=s;
else
{if((s!=null)&&(Q[front]!=null))
if(rear%2==0) Q[front]->lchild=s;
else Q[front]->rchild=s;
if(rear%2==1) front++;
}
}
return root;
}
void preorder(struct node *p)
{if(p!=null)
{printf("%c",p->data);
preorder(p->lchild);
preorder(p->rchild);}

首先,定义node结构,其中有三个属性分别为node的值,他的左孩子和右孩子为node型的指针。输出分别采用前序、中序和后序的顺序,此解法用的是递归的方法输出,而原题要求按非递归输出前缀和后缀表达式,非递归要用到栈或队列。

前缀表达式的非递归实现如下:
void iterativePreorder(struct *p)
{
stack<node*> travStack;//栈
p=root;
if(p!=0)
{
travStack.push(p);//p不得0,则进栈
while(!travStack.empty())
{
p=stravStack.pop();
visit(p);
if(p->rchild!=0)
travStack.push(p->rchild);/*注意一定要把右孩子先进栈,因为栈是后进先出的数据结构*/
if(p->lchild!=0)
travStack.push(p->lchild);

}
}

}

题目要求“非递归算法”,这个程序是递归算法啊!

补充:
上次给你的是我blog上的,我测试过的,不会运行不起的吧

如果用非递归,比较麻烦,我还没有想过怎么做呢