【问题描述】按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树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;
}
结果截图: