二叉树层次遍历(队列法、每层打印)——C++

声明:本文原题主要来自力扣,记录此博客主要是为自己学习总结,不做任何商业等活动!

前面博文总结了二叉树的前序遍历、中序遍历、后序遍历,本文主要总结二叉树的层次遍历。本文通过力扣上的示例打印出二叉树每层节点。

一、二叉树层次遍历

1.1 力扣原题

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

示例:
二叉树:[3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其层序遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

1.2 题目分析

由上面题目可知,输入是一个一维数组,输出是一个二维数组。其中输入一维数组中存储的是节点元素,输出二维数组是每层节点关键字打印。故知道该题主要考察二叉树基本的层次遍历方法,需要打印出每层节点的关键字。

1.3 实现思路

二叉树的层次遍历实现思路是用一个队列记录每层节点,当记录第一层节点时,弹出第一层节点进行访问,访问的同时需要遍历对应节点的左右子节点压栈;当访问完一层节点时,此时改成节点所有左右子节点都已经压栈,由于先前循环弹出了第一层的n个节点,故当前队列只存储下一层所有节点,所以只需要将该队列大小保存,然后该轮循环中弹出这么多个节点,即可一层层访问二叉树,直到访问完截止。

1.4 具体代码实现

二叉树的层次遍历如下,打印每层节点代码如下

class Solution {
public:
    vector> levelOrder(TreeNode* root) {
        if (root == nullptr)
            return {};
        TreeNode* curNode = nullptr;
        vector perLevelNodes;
        vector> result;
        int count = 0;
        std::queue nodeQueue;
        nodeQueue.push(root);
        while (!nodeQueue.empty()) // 每轮循环,都访问一层节点
        {
            perLevelNodes.clear();
            count = nodeQueue.size(); // 当前层有count个节点
            for (int i = 0; i < count; ++i) 
            { // 循环弹出count次节点进行访问,也就是访问该层所有节点;同时将下一层所有节点压入栈
                curNode = nodeQueue.front();
                nodeQueue.pop();
                perLevelNodes.push_back(curNode->val);
                if (curNode->left != nullptr) // 左子节点非空压入栈
                    nodeQueue.push(curNode->left);
                if (curNode->right != nullptr) // 右子节点非空压入栈
                    nodeQueue.push(curNode->right);
            }
            result.push_back(perLevelNodes); // 将每层节点数组保存起来
        }
        return std::move(result); // 返回结果数组
    }
};

二叉树层次遍历(队列法、每层打印)——C++_第1张图片 

你可能感兴趣的:(C++刷题,数据结构与算法,c++,算法,深度优先)