BWM Studio

The Blow Water Machines...

第九章第十七题(赶出来的作业) powerby ktl

//第九章第17题;用非递归算法设计先序遍历二叉树;
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#define N 15   //需要设置栈的最大值,若二叉树深度为四,则设置2^4-1=15;
#define maxsize 15  //本程序根据书本p194,图9-8,输入数据为ABCDEFG@@@@L@@@#,输出为先序排列:ABDECFLG;

typedef char datatype;

typedef struct node
{
 datatype data;
 struct node *lchild,*rchild;
}bitree;

bitree *root;

bitree * CreatTree(void)
{
 char ch;
 bitree * Q[maxsize];
 int front,rear;
 bitree *root,*s;
 root=NULL;
 front=1;
 rear=0;
 printf("请输入字符构造二叉树,#结束,@表示虚结点./n");
 while((ch=getche())!='#')
 {
  s=NULL;
  if(ch!='@')
  {
   s=(bitree*)malloc(sizeof(bitree));
   s->data=ch;
   s->lchild=NULL;
   s->rchild=NULL;
  }
  rear++;
  Q[rear]=s;
  if(rear==1)
   root=s;
  else
  {
   if(s&&Q[front])
    if(rear%2==0)
     Q[front]->lchild=s;
    else
     Q[front]->rchild=s;
    if(rear%2==1)
     front++;
  }
 }
 printf("创建二叉树完成.../n");
 return root;
}
bitree *stack[N];
void preorder(bitree*p)
{
 printf("本函数实现的是先序非递归排列./n");
 bitree *s;
 int top;
 if(p!=NULL)
 {
  top=-1;
  s=p;
  while((top!=-1)||(s!=NULL))
  {
   while(s!=NULL)
   {
    if(top==N-1)
    {
     printf("上溢/n");
     return;
    }
    else
    {
     top++;
     printf("%c",s->data);  //与中序不同在于printf的位置要在进行左子树遍历之前;
     stack[top]=s;
     s=s->lchild;
    }
   }
   s=stack[top];
   top--;
  // printf("%c",s->data);原来中序遍历的时候printf的位置;
   s=s->rchild;
  // printf("%c",s->data);加在这为后序遍历;
  }
 }
 return;
}

int main()
{
 root=CreatTree();
 preorder(root);
 return 0;
}

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭