zoukankan      html  css  js  c++  java
  • 层次遍历二叉树

    任务描述

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

    相关知识

    为了完成本关任务,你需要掌握: 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 , 层次遍历算法思想: (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;
        }
    }
  • 相关阅读:
    批处理命令系列
    CMD批处理之PC查看连过的WIFI密码
    数据结构与算法之各种方法遍历二叉树
    二叉树同构判定算法
    卡拉兹(Callatz)猜想
    Java之字符串比较大小
    Java报错之StackOverflowError
    火绒勒索病毒诱捕技术浅析
    数据结构与算法之二叉链树
    数据结构与算法之广义表的基本运算
  • 原文地址:https://www.cnblogs.com/xxxsans/p/14004427.html
Copyright © 2011-2022 走看看