层序遍历函数
void LevelOrder(BinTree T) {
queue<BinTree> q;//创建树类型的队列
if (T!=NULL)
q.push(T);//树不为空,入队
while (q.size()) {
if (T != NULL) {
T = q.front();//获取队头
cout << q.front()->data << "->";
if (T->left != NULL) {//不为空 左儿子入队
q.push(T->left);
}
if (T->right != NULL) {//不为空 右儿子入队
q.push(T->right);
}
q.pop();
}
}
}
思路
这里偷懒了,使用STL直接创建了一个队列储存二叉树的结点。没学过的可以看看C++的STL部分。
先将根节点入队,再判断队头(根节点)是否有左右儿子,有就入队,然后弹出队头。下一个元素则成了队头,继续判断队头是否有左右儿子,继续入队,直至队列为空。
源代码
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef struct TreeNode {
char data;//数据
struct TreeNode* left;//左孩子
struct TreeNode* right;//右孩子
}TreeNode, * BinTree;
//先序遍历初始化二叉树
BinTree Create(BinTree T) { //传入的是拷贝的指针,对这个拷贝的指针进行了一系列处理,如果不想返回,则需用二重指针
char ch;
cin >> ch;
if (ch == '#')
T = NULL;
else {
//传递的是指针,还没有开辟二叉树的存储空间
T = (BinTree)malloc(sizeof(TreeNode));//开辟空间
T->data = ch;//赋值
T->left = Create(T->left);//继续递归,将左儿子的空间开辟,赋值
T->right = Create(T->right);//继续递归,将右儿子的空间开辟,赋值
}
return T;
}
void PreOrder(BinTree T) {
if (T != NULL) { //不为空
printf("%c", T->data);
PreOrder(T->left);
PreOrder(T->right);
}
}
void MidOrder(BinTree T) {
if (T != NULL) { //不为空
printf("%c", T->data);
MidOrder(T->left);
MidOrder(T->right);
}
}
void BackOrder(BinTree T) {
if (T != NULL) { //不为空
printf("%c", T->data);
BackOrder(T->left);
BackOrder(T->right);
}
}
void LevelOrder(BinTree T) {
queue<BinTree> q;//创建树类型的队列
if (T!=NULL)
q.push(T);//树不为空,入队
while (q.size()) {
if (T != NULL) {
T = q.front();//获取队头
cout << q.front()->data << "->";
if (T->left != NULL) {//不为空 左儿子入队
q.push(T->left);
}
if (T->right != NULL) {//不为空 右儿子入队
q.push(T->right);
}
q.pop();
}
}
}
int main() {
BinTree T = NULL;//定义二叉树类型的指针
T = Create(T);//返回被开辟的空间地址
printf("前序遍历\n");
PreOrder(T);
printf("\n");
printf("中序遍历\n");
MidOrder(T);
printf("\n");
printf("后序遍历\n");
BackOrder(T);
printf("\n");
printf("层序遍历\n");
LevelOrder(T);
printf("\n");
return 0;
}
/*
ABD##E##CF##G##
*/