- 难度: 中等
- 通过率: 46.1%
- 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目描述
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3/ \9 20/ \15 7
返回其层次遍历结果:
[[3],[9,20],[15,7] ]
基于队列的解法
维护一个队列,从根节点开始遍历二叉树,遇到一个节点后就将其放入队列,下次遍历的节点,从队列的头部取。这样得到的效果就是,先入队的先被访问,即先访问第一层,而后第二层,以此类推。最终就实现了层次遍历。
如果一次出队一个节点,为了区别节点的层级,需要加入层级信息。其实没有必要。可以一次性把同一层的节点全部出队并处理。
class Solution {
public:vector<vector<int>> levelOrder(TreeNode *root) {vector<vector<int>> res;queue<TreeNode *> queue_;if(root){queue_.push(root);}while(!queue_.empty()){int size = queue_.size();vector<int> nums;for (size_t i = 0; i < size; i++){TreeNode* node = queue_.front();queue_.pop();nums.push_back(node->val);if(node->left){queue_.push(node->left);}if(node->right){queue_.push(node->right);}}res.push_back(::move(nums));}return res;}
};
递归解法
从根节点起,采用先序遍历,记录每个节点的层级,把节点的值插入对应层级的数组中。
class Solution {
public:vector<vector<int>> levelOrder(TreeNode *root) {vector<vector<int>> res;traverse(root, 1, res);return res;}void traverse(TreeNode *root, size_t level, vector<vector<int>> &res) {if (!root) {return;}if (res.size() < level) {res.emplace_back();}res[level-1].push_back(root->val);traverse(root->left, level + 1, res);traverse(root->right, level + 1, res);}
};