任务描述
本关任务:给定一棵二叉树,借助队列实现层次遍历二叉树。
相关知识
为了完成本关任务,你需要掌握: 1、STL框架队列的使用; 2、二叉树层次遍历。
1、STL框架队列的使用 (1)引入头文件 #include<queue>// 队列
(2)定义队列 queue<int> q; //参数是数据类型,这是队列的定义方式
(3)常用操作
q.empty()// 如果队列为空返回true,否则返回false
q.size() // 返回队列中元素的个数
q.pop() //删除队列首元素但不返回其值
q.front() // 返回队首元素的值,但不删除该元素
q.push(X) //在队尾压入新元素 ,X为要压入的元素
q.back() //返回队列尾元素的值,但不删除该元素
2、二叉树层次遍历 层次遍历定义:从二叉树的第1层(即根结点)开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。如下图1所示,其层次遍历结果为:ABECDF 层次遍历算法思想: (1)初始化队列,把根结点进队 (2)读队头元素,并把其孩子结点中非空的结点按先左后右的顺序进队,重复2,直到队列为空。
编程要求
在右侧编辑器中补充代码,完成CreateBiTree函数(可参考第一关)HierarchyOrder函数,以实现二叉树的创建和层次遍历。具体要求如下:
输入输出说明
输入为一组测试用例,测试用例为二叉树的扩展先序遍历(二叉树中缺失的孩子结点使用‘#’表示),根据输入建立二叉链表,并输出该二叉树的层次遍历结果。
测试输入: ABC##D##EF###
预期输出: ABECDF (注意:末尾不换行)
#include<iostream> #include<string> #include<queue> using namespace std; struct BNode {//二叉树节点 BNode(const char d = '#') :data(d), lchild(nullptr), rchild(nullptr) {}; char data; BNode* lchild; BNode* rchild; }; //根据先序遍历构建一棵二叉树,返回root指针 BNode* constructBinaryTree(const string& preOrder, unsigned& index) { if (preOrder.size() == 0 || index == preOrder.size() || preOrder[index] == '#')//若空串或者index超出范围,则返回空指针 return nullptr; BNode* T = new BNode(preOrder[index++]); T->lchild = constructBinaryTree(preOrder, index); T->rchild = constructBinaryTree(preOrder, ++index); return T; } void HierarchyOrder(BNode* root)// 二叉树的层次遍历(借助队列实现) { // 请在这里补充代码,完成本关任务 /********** Begin *********/ if (root == NULL) return; // 创建一个空队列 queue<BNode *> q; q.push(root); while (!q.empty()) { // 遍历当前节点 BNode *node = q.front(); cout << node->data; q.pop(); // 左子节点入队 if (node->lchild != NULL) q.push(node->lchild); // 右子节点入队 if (node->rchild != NULL) q.push(node->rchild); } } int main() { string str; while (cin >> str) { unsigned index = 0; BNode* root = constructBinaryTree(str, index); HierarchyOrder(root); cout << endl; } }