二叉树的层次遍历

【问题描述】按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T,求这颗二叉树的层次遍历的序列。(输入时,#号代表这个结点没有左孩子或者右孩子)

【输入形式】A C F # # E J # # # B # D H # # G # #

【输出形式】ACBFEDJHG

算法思想: 
用一个队列保存被访问的当前节点的左右孩子以实现层次遍历。在进行层次遍历的时候,设置一个队列结构,遍历从二叉树的根节点开始,首先将根节点指针入队列,然后从队头取出一个元素,每取一个元素,执行下面两个操作:
1、访问该元素所指向的节点。
2、若该元素所指节点的左右孩子节点非空,则将该元素所指节点的左孩子指针和右孩子指针顺序入队。
此过程不断进行,当队列为空时,二叉树的层次遍历结束。

算法步骤:
1、将二叉树的根节点进入队列中,判断队列不为NULL。
2、打印输出该节点存储的元素。
3、判断节点如果有孩子(左孩子、右孩子),就将孩子进入队列中。
4、循环以上操作,直到 T->lchild == NULL、T->rchild=NULL。

代码实现:

#include<bits/stdc++.h> //万能头文件 
//#include<iostream>
//#include<stdio.h>
//#include<math.h>
#define  MAXQSIZE  100
using namespace std;

/*算法步骤 
1、将二叉树的根节点进入队列中,判断队列不为NULL。
2、打印输出该节点存储的元素。
3、判断节点如果有孩子(左孩子、右孩子),就将孩子进入队列中。
4、循环以上操作,直到 T->lchild == NULL、T->rchild=NULL。
*/ 
//定义二叉树结构 
struct BiNode{
    int data;
    BiNode *lchild,*rchild;
};

//定义队列结构 
struct SqQueue{
    BiNode* base[100];
    int front,rear;
};

//用前序遍历的思想创建二叉树 
void CreateBiTree(BiNode *&T)
{        
    char ch;
    cin >> ch;
    if(ch=='#') T=NULL;   //#号代表这个结点没有左孩子或者右孩子                       
    else{                                                        
        T=new  BiNode;	//申请一个节点 
        T->data=ch;                                          
        CreateBiTree(T->lchild);          
        CreateBiTree(T->rchild);          
    }                                                          
}        

int rear=0;
int front=0;

//入队列 
void EnQueue(BiNode **Q, BiNode *node){	//**Q表示指向BiNode型的指针的指针变量 
	Q[rear++] = node;
}
 
//出队列 
BiNode *DeQueue(BiNode **Q){
    return Q[front++];
}
 
//打印节点 
void pintNode(BiNode *node){
    printf("%c", node->data);
}

//层次遍历二叉树 
void LevelOrder(BiNode *T){
    BiNode *Q[MAXQSIZE];
    BiNode *p;	//临时节点,存放要打印的节点 
    EnQueue(Q, T);
    while(front < rear){
        p = DeQueue(Q);  
        pintNode(p);  
        if(p->lchild != NULL) {
            EnQueue(Q, p->lchild);
        }
        if (p->rchild != NULL) {
            EnQueue(Q, p->rchild);
        }
    }
}

int main()
{
    BiNode  *Tree;
    CreateBiTree(Tree);
    LevelOrder(Tree);
    return  0;
}

结果截图:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值