| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 415 人关注过本帖
标题:先序遍历二叉树非递归
只看楼主 加入收藏
yxy1995523
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2012-11-15
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:2 
先序遍历二叉树非递归
大家伙儿帮我看看我先序遍历二叉树为何只能遍历左子树,求指点啊


#include<stdio.h>

#include<stdlib.h>
#define MAXSIZE 100
typedef char elemtype;
typedef struct  bitree
{   
    elemtype data;
    struct bitree *lchild,*rchild;
}BTREE;

BTREE *create()
{//非递归创建二叉树
   BTREE *q[100]; //定义q数组作为队列存放二叉链表中结点,100为最大容量
   BTREE *s;                //二叉链表中的结点
   BTREE *root ;            //二叉链表的根指针
   int front=1,rear=0,i;      //定义队列的头、尾指针
   char ch;                 //结点的data域值
   root=NULL;
   for(i=0;i<100;i++)
       q[i]=NULL;
   printf("请按层次依次输入二叉树中的结点:\n");
   printf("空结点以逗号代替,以#号结束!\n");
   ch=getchar();
   while(ch!='#')     //输入值为#号,算法结束
    {
       s=NULL;
       if(ch!=',')    //输入数据不为逗号,表示不为虚结点,否则为虚结点
        {
           s=(BTREE *)malloc(sizeof(BTREE));   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;   //rear为偶数,s为双亲左孩子
              else
                q[front]->rchild=s;   //rear为奇数,s为双亲右孩子
            }         
          if(rear%2==1) front++;    //出队
        }  
       ch=getchar();      
    }
   return root;
}

void preorder(BTREE *root)
{//非递归实现的先序遍历
  BTREE *type[100];
  int top=0;
//seqstack stack[MAXSIZE];
  BTREE *p;
 p=root;
 do
  {
    while(p!=NULL)
    {
        
        printf("%c",p->data);
        type[++top]=p;
        p=p->lchild;
    }
   p=type[top];
   p=p->rchild;
  }while(top>0);

}

void inorder(BTREE *root)
{//非递归实现的中序遍历
  













}

void postorder(BTREE *root)
{//非递归实现的后序遍历  
  BTREE *p,*s1[100];             //s1栈存放树中结点
  int s2[100],top=0,b;           //s2栈存放进栈标志
  p=root;
  do
   {
     while(p!=NULL)
        {
         s1[top]=p;
         s2[top++]=0;    //第一次进栈标志为0
         p=p->lchild;
        }
     if(top>0)
     {
      b=s2[--top];
      p=s1[top];
      if(b==0)
       {
          s1[top]=p;
          s2[top++]=1;  //第二次进栈标志为0
          p=p->rchild;
        }
      else
        {
          printf("%c",p->data);
          p=NULL;
        }
     }
   }while(top>0);
}

void  lorder(BTREE  *root)
{//非递归实现的层次遍历  
    BTREE *q[MAXSIZE],*p;      // maxsize为最大容量
    int f,r;                   // f,r类似于头尾指针
    q[1]=root;
    f=r=1;
    while(f<=r)
        {
         p=q[f];
         f++;                 //出队
         printf("%c",p->data);
         if(p->lchild!=NULL)
            {
             r++;
             q[r]=p->lchild;
            }        //入队
         if(p->rchild!=NULL)
            {
             r++;
             q[r]=p->rchild;
            }   //入队
        }
}

void showmenu()
{//显示菜单
    printf("    欢迎使用二叉树操作演示小软件\n");
    printf("\t1、创建二叉树\n");
    printf("\t2、先序遍历二叉树\n");
    printf("\t3、中序遍历二叉树\n");
    printf("\t4、后序遍历二叉树\n");
    printf("\t5、层次遍历二叉树\n");
    printf("\t6、退出程序\n");   
}

void main()
{
    BTREE *root=NULL;
    int no;
    while(1)
    {
        showmenu();
        printf("   请输入你的选择:");
        scanf("%d",&no);
        fflush(stdin);//清除键盘缓冲区
        switch(no)
        {
          case 1:root=create();
                 printf("二叉树创建成功,按任意键继续…\n");
                 getch();
                 system("cls");
                 break;
          case 2:printf("二叉树先序遍历结果为:\n");
                 preorder(root);
                 printf("\n");
                 system("pause");
                 system("cls");
                 break;
          case 3:printf("二叉树中序遍历结果为:\n");
                 inorder(root);
                 printf("\n");
                 system("pause");
                 system("cls");
                 break;
          case 4:printf("二叉树后序遍历结果为:\n");
                 postorder(root);
                 printf("\n");
                 system("pause");
                 system("cls");
                 break;
          case 5:printf("二叉树层次遍历结果为:\n");
                 lorder(root);
                 printf("\n");
                 system("pause");
                 system("cls");
                 break;
          case 6:return;
          default:
                 printf("你的输入有误,请从新输入!\n");                 
        }
    }
}
搜索更多相关主题的帖子: include create 二叉树 
2014-06-05 09:30
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:10 
不好意思,这些不是很懂,帮不了你

我不是砖家,要努力成为砖家。
2014-06-05 13:47
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:10 
不是很懂
2014-06-05 16:16
快速回复:先序遍历二叉树非递归
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014743 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved