任务描述

本关任务:给定一棵二叉树,借助队列实现层次遍历二叉树。

相关知识

为了完成本关任务,你需要掌握: 1、STL框架队列的使用; 2、二叉树层次遍历。

1、STL框架队列的使用 (1)引入头文件 #include<queue>// 队列 (2)定义队列 queue<int> q; //参数是数据类型,这是队列的定义方式 (3)常用操作

  1. q.empty()// 如果队列为空返回true,否则返回false
  2. q.size() // 返回队列中元素的个数
  3. q.pop() //删除队列首元素但不返回其值
  4. q.front() // 返回队首元素的值,但不删除该元素
  5. q.push(X) //在队尾压入新元素 ,X为要压入的元素
  6. q.back() //返回队列尾元素的值,但不删除该元素

2、二叉树层次遍历 层次遍历定义:从二叉树的第1层(即根结点)开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。如下图1所示,其层次遍历结果为:ABECDF 层次遍历二叉树_#include 层次遍历算法思想: (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;
    }
}