树的遍历提高

#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 *Seqstack[MAXSIZE];        
    int top=-1;
    BTREE *p,*t;
    t=root;
    if(t!= NULL)
    {
        top++;
        Seqstack[top]=t;                      // 先将根结点压栈
        while(top>-1)                         // 栈不为空时循环
        {
            p=Seqstack[top];                  // 栈顶元素出栈
            top --;
            printf("%c ",p->data);             // 访问栈顶元素
            if(p->rchild!= NULL)               // 如果右孩子不为空,则进栈
            {
                top ++;
                Seqstack[top] = p->rchild;
            }
            if(p->lchild!= NULL)               // 如果左孩子不为空,则进栈
            {
                top++;
                Seqstack[top]= p->lchild;
            }
        }
    }
}

void inorder(BTREE *root)
{//非递归实现的中序遍历
 
    BTREE* Seqstack[MAXSIZE];
    int top =-1;
    BTREE *p,*t;
	t=root;
    if(t!=NULL)
    {
        p=t;
        while(top>-1||p!=NULL)              
        {
            while(p!=NULL)                        // while循环将根结点的最左结点全部压栈
            {
                top++;
                Seqstack[top]=p;
                p=p->lchild;
            }
            if(top>-1)                            // 当结点p没有最左结点时出栈
            {
                p=Seqstack[top];
                printf("%c ", p->data);             // 访问结点p
                top --;
                p=p->rchild;                      // 转向处理右孩子结点
            }
        }
    }

}

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");			    
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值