Chinaunix首页 | 论坛 | 博客
  • 博客访问: 414464
  • 博文数量: 51
  • 博客积分: 2030
  • 博客等级: 大尉
  • 技术积分: 1109
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-15 08:11
文章分类

全部博文(51)

文章存档

2022年(1)

2016年(2)

2015年(1)

2014年(2)

2013年(4)

2011年(9)

2010年(2)

2009年(5)

2008年(14)

2007年(11)

我的朋友

分类: C/C++

2010-07-19 09:35:58

#include
#include
struct tree
{
     char data;
     struct tree *lchild;
     struct tree *rchild;
};
typedef struct tree * treptr;
treptr build(treptr t)//先序建树
{
     char c;
     c=getchar();
    if(c=='#')
    {
          t=NULL;
     }
     else
     {
          t=(treptr)malloc(sizeof(struct tree));
          t->data=c;
          t->lchild=build(t->lchild);
          t->rchild=build(t->rchild);
     }
     return t;
}
#if 0
void postdorder_b(treptr root)//这是前序遍历递归实现
{
     if (root!=NULL)
     {
          printf("%c",root->data);
          postdorder(root->lchild);
           postdorder(root->rchild);
      }
}
void postdorder_m(treptr root)//这是中序遍历递归实现
{
     if (root!=NULL)
     {
          postdorder(root->lchild);
          printf("%c",root->data);
          postdorder(root->rchild);
     }
}
void postdorder_l(treptr root)//这是后序遍历递归实现
{
     if (root!=NULL)
     {
          postdorder(root->lchild);
          postdorder(root->rchild);
         printf("%c",root->data);
     }
}
#endif
struct stack
{
 treptr *top,*base;
};
typedef struct stack *stackptr;
void init (stackptr s)//初始化栈
{
 s->base=(treptr*)malloc(sizeof(treptr)*100);
 s->top=s->base;
}
void push(stackptr s,treptr t)//入栈
{
 *(s->top++)=t;
}
treptr pop(stackptr s)//弹出栈顶元素
{
 treptr t;
 t=*(--(s->top));
 return t;
}
treptr gettop(stackptr s)//取栈顶元素
{
 treptr *l=s->top-1;
 return *(l);
}
void postorder_l(treptr t)//这是非递归后序实现
{
 stackptr s=(stackptr)malloc(sizeof(struct stack));
 treptr temp=t;
 treptr p;
 treptr lastvist=NULL;
 init(s);
 p=t;
 while(p||s->top!=s->base)
 {
  while(p)
  {
     push(s,p);
     p=p->lchild;
  }
  temp=gettop(s);
  if(temp->rchild==NULL||temp->rchild==lastvist)
  {
     putchar(temp->data);
     lastvist=pop(s);
  }
  else
    p=temp->rchild;
 }
}
void postorder_m(treptr t)//这是非递归中序实现
{
 stackptr s=(stackptr)malloc(sizeof(struct stack));
 treptr temp=t;
 treptr p;
 treptr lastvist=NULL;
 init(s);
 p=t;
 while(p||s->top!=s->base)
 {
  while(p)
  {
     push(s,p);
     p=p->lchild;
  }
  temp=pop(s);
  putchar(temp->data);
  p=temp->rchild;
 }
}
void postorder_b(treptr t)//这是非递归前序实现
{
 stackptr s=(stackptr)malloc(sizeof(struct stack));
 treptr temp=t;
 treptr p;
 treptr lastvist=NULL;
 init(s);
 p=t;
 while(p||s->top!=s->base)
 {
  while(p)
  {
    putchar(p->data);
    push(s,p);
    p=p->lchild;
  }
  temp=pop(s);
  p=temp->rchild;
 }
}
int main()
{
 treptr t=NULL;
 t=build(t);
 //postdorder(t);
 printf("\n非递归前序遍历\n");
 postorder_b(t);
 printf("\n非递归中序遍历\n");
 postorder_m(t);
 printf("\n非递归后序遍历\n");
 postorder_l(t);
 printf("\n");
 return 0;
}
阅读(2999) | 评论(0) | 转发(0) |
0

上一篇:单链表逆序示例

下一篇:makefile示例

给主人留下些什么吧!~~