题目描述:(使用顺序、循环队列进行操作)
从键盘输入一个字符串,其中#表示空。
例:上图输入为
Sample Input:
ADB#A##C##G#FE###
使用队列将二叉树分层输出。
Sample Output:
HDGBCFAE
思路:
- 先根节点入队,然后:
- 从队列中取出一个元素
- 访问该元素所指的结点
- 若该元素所指结点的左、右孩子结点非空,则将其左、右孩子的指针顺序入队
具体代码如下:
//c语言实现二叉树层次遍历(借助队列实现)
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
//二叉链表类型定义
typedef struct btnode
{
char data;
struct btnode *lchild,*rchild;
}bitree,*Bitree;
//建二叉树
Bitree Initiate()
{
char ch;
Bitree t;
ch = getchar();
if(ch == '#')
t = NULL;
else
{
t = (Bitree)malloc(sizeof(bitree));
t->data = ch;
t->lchild = Initiate();
t->rchild = Initiate();
}
return t;
}
//二叉树的层次遍历(顺序队列)
void levelOrder1(Bitree T)
{
if(T == NULL)//当队列为空时
return;
Bitree s[MAXSIZE];//建立一个数组
int front,rear;
front = rear = -1;
s[++rear] = T;//树根入栈s[0]的位置
while(rear != front)
{
Bitree q = s[++front];//队列的队头元素出栈
printf("%c",q->data);//输出元素
if(q->lchild)
s[++rear] = q->lchild;//树的左孩子入栈
if(q->rchild)
s[++rear] = q->rchild;//树的右孩子入栈
}
}
//二叉树的层次遍历(循环队列)
void levelOrder2(Bitree T)
{
if(T == NULL)
return;
Bitree s[MAXSIZE];
int front,rear;
front = rear = -1;
s[++rear] = T;//树根入栈s[0]的位置
while(front != rear)
{
front = (front + 1)%MAXSIZE;
Bitree q = s[front];//队列的队头元素出栈
printf("%c",q->data);//输出元素
if(q->lchild)
{
rear = (rear + 1)%MAXSIZE;
s[rear] = q->lchild;// 若节点q存在左孩子,则将左孩子指针入队;
}
if(q->rchild)
{
rear = (rear + 1)%MAXSIZE;
s[rear] = q->rchild;// 若节点q存在右孩子,则将右孩子指针入队;
}
}
}
int main()
{
Bitree T;
printf("按先序序列输入结点序列,'#'代表空:\n");
T = Initiate();
printf("顺序栈输出:\n");
levelOrder1(T);
printf("\n");
printf("循环栈输出:\n");
levelOrder2(T);
printf("\n");
return 0;
}