二叉树的层序遍历

//层序遍历:
/*-------------------------------------------------------------------------
  1.使用队列,
  2.只要有儿子,就进,先左儿子或右儿子都ok
  3.进完儿子后,就调用对头元素,输出它,并让其儿子进队列
  4.当队列为空时候,就扫描完毕了
*/
//----------------------------------------------------------------------------
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <iostream.h>


#define MaxSize 100
#define max 100
typedef char ElemType;
typedef struct node
{
  ElemType data;        //数据元素
  struct node *lchild;    //指向左孩子
  struct node *rchild;    //指向右孩子
} BTNode;


void CreateBTNode(BTNode *&b,char *str);
void lxu(BTNode* head); //后序


void main()
{
  BTNode *b;
  CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"); 
 //CreateBTNode(b,"A(B(C(D,),E(F,G)),I(,J))"); 
  lxu(b);cout<<endl; 
}
void CreateBTNode(BTNode *&b,char *str)   ///由str串创建二叉链
{
  BTNode *St[MaxSize],*p=NULL;
  int top=-1,k,j=0;  
  char ch;
  b=NULL;       //建立的二叉树初始时为空
  ch=str[j];
  while (ch!='\0')  //str未扫描完时循环
  {
        switch(ch) 
    {
    case '(':top++;St[top]=p;k=1; break;    //为左节点
    case ')':top--;break;
    case ',':k=2; break;                        //为右节点
    default:p=(BTNode *)malloc(sizeof(BTNode));
      p->data=ch;p->lchild=p->rchild=NULL;
              if (b==NULL)                    //p指向二叉树的根节点
            b=p;
          else                //已建立二叉树根节点
          { 
            switch(k) 
            {
            case 1:St[top]->lchild=p;break;
            case 2:St[top]->rchild=p;break;
            }
          }
    }
    j++;
    ch=str[j];
  }
}


//---------------------------------------------------------------------------------------//
void lxu(BTNode* head)
{
BTNode *st[MaxSize],*p=head;
  int dui_front=0,dui_rear=0;


    st[dui_rear++ % MaxSize]=head;
   while(true){
         p=st[dui_front++ % MaxSize];//调用队头,并且输出
         cout<<p->data;
        if(p->lchild)st[dui_rear++ % MaxSize]=p->lchild;//进
        if(p->rchild)st[dui_rear++ % MaxSize]=p->rchild;


        if(dui_front >= dui_rear)break;//返回到了树顶了
    }
}
//---------------------------------------------------------------------------------------//


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫云的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值