力扣-102-二叉树的层序遍历
题目分析:二叉树的层序遍历就是把二叉树分层,然后每一层从左到右遍历节点。这和宽度优先搜索$bfs$是一致的,但是二者的输出结果不同:层序遍历必须区分每一层,返回的是一个二维数组;而$bfs$返回的是一维数组。如下图所示:
那么如何修改$bfs$呢?我们可以在每一层遍历的开始前,记录队列中的节点数量$num$(即每一层的节点数量),然后一口气处理完这些节点。
$bfs$使用队列来实现,代码框架如下:
void bfs(TreeNode* root) { queue<TreeNode*> que; que.push(root); while (!que.empty()) { TreeNode* node = que.front(); que.pop(); if (node->left != NULL) { que.push(node->left); } if (node->right != NULL) { que.push(node->right); } } }
本题代码如下:
/*二叉树的层序遍历使用bfs*/ #include <queue> #include <vector> using namespace std; /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { if (root == NULL) return {}; vector<vector<int>> res; queue<TreeNode*> tree; tree.push(root); while(!tree.empty()){ vector<int> level; int num = tree.size(); for(int i = 0; i < num; i++){ TreeNode* node = tree.front(); tree.pop(); level.push_back(node->val); if(node->left != NULL) tree.push(node->left); if(node->right != NULL) tree.push(node->right); } res.push_back(level); } return res; } };
作者:Ryanjie
出处:http://www.cnblogs.com/ryanjan/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!