关闭

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

437人阅读 评论(0) 收藏 举报

//第九章第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;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:34028次
    • 积分:746
    • 等级:
    • 排名:千里之外
    • 原创:40篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条