C++从上到下打印二叉树----层序遍历(广度优先遍历)附代码实现

C++从上到下打印二叉树----层序遍历(广度优先遍历)附代码实现_第1张图片

深度优先遍历对应的是前序、中序、后续遍历
广度优先对应的是层序遍历

题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。BFS 通常借助 队列 的先入先出特性来实现。
具体思路:
根据队列先进先出原则,那么我们一开始把根节点放入,优先弹出的也是根节点,然后接着判断是否有左右节点,有则放入它的左右子节点,无则略过,与此同时再弹出根节点,如此循环,队列就会一直去遍历他们的子节点,直到底层。而要想打印每一层的节点,就要在放入子节点后,及时弹出根节点,此时更新队列大小,建立一个循环把队列中的子节点全部放入一维数组,再将一位数组放入二维数组,一维数组清零,接着再放入子节点,弹出根节点如此循环往复即可实现层序遍历打印二叉树,接着看代码:

#include <iostream>
#include<vector>
#include<queue>
using namespace std;
struct TreeNode {
     
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) :val(x), left(NULL), right(NULL) {
     };
};
class Solution {
     
private:
    vector<vector<int>> res;
    vector<int> rec;
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
     
        queue<TreeNode*> q;
        if (root) {
     
            q.push(root);//一开始初始化放入根节点
        }
        while (!q.empty()) {
     
            int size = q.size();//更新队列大小
            for (int i = 0; i < size; i++) {
     //将这一层节点全部弹出放入数组,并同时放入下一层节点,因为一个根节点要对应两个子节点判断哦
                TreeNode* front = q.front();
                rec.push_back(front->val);
                q.pop();//弹出根节点
                if (front->left) {
     
                    q.push(front->left);
                }
                if (front->right) {
     
                    q.push(front->right);
                }
            }//放入子节点完成
            res.push_back(rec);
            rec.clear();
        }
        return res;
    }

};
int main()
{
     
    TreeNode* x1 = new TreeNode(1);
    TreeNode* x2 = new TreeNode(2);
    TreeNode* x3 = new TreeNode(3);
    TreeNode* x4 = new TreeNode(4);
    TreeNode* x5 = new TreeNode(5);
    TreeNode* x6 = new TreeNode(6);
    TreeNode* x7 = new TreeNode(7);
    x1->left = x2;
    x1->right = x3;
    x2->left = x4;
    x2->right = x5;
    x3->left = x6;
    x3->right = x7;
    Solution* x = new Solution;
    vector<vector<int>> res;
    res = x->levelOrder(x1);
    for (int i = 0; i < res.size(); i++) {
     
        for (int j = 0; j < res[i].size(); j++) {
     
            cout << res[i][j] << " ";
        }
        cout << endl;
    }

}

测试结果:
在这里插入图片描述

你可能感兴趣的:(数据结构,C++,二叉树,数据结构,队列,c++)