给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
来源:力扣(LeetCode)
链接: https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
解题思路:
这个题比以前的层序遍历多了一步操作,那就是在输出的时候按照层序一层一层的输出。我们并不能简单的在打印上按照数字输出比如,第一层输出1个,第二层2个,第三层4个。而是要根据实际的每层有一个元素就输出什么。
回想层序遍历的方法是:将头结点和它的左右孩子节点全部入队,然后打印头节点,头节点出队,在这里我们可以将一个完整的二叉树看成单个的最小二叉树,所以头节点不单单指整个二叉树的头节点,而是每个最小二叉树的头节点。根据队列的特点,先入先出,就可以很好地完成层序遍历。
但是按层序输出是一个问题,可以想到,第一层 队列长度为1,第一层出队之后剩下的是下一层的所有元素,并且根据队列长度可以控制每一行输出的个数。
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
class Solution {
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL)
{}
};
public:
vector<vector<int>> levelOrder(TreeNode* root)
{
vector<vector<int>> res;
if (!root)
{
return res;
}
vector<int> vtmp;
/* 层序遍历 ,先将头入队*/
queue<TreeNode*> qu;
TreeNode* cur=root;
qu.push(root);
int len = 1;
/* 层序遍历 */
while ( !qu.empty())
{
/* 控制压进vector的元素个数 */
for (int i = 0; i < len; ++i)
{
cur = qu.front();
vtmp.push_back(cur->val);
qu.pop();
if (cur->left)
{
qu.push(cur->left);
}
if (cur->right)
{
qu.push(cur->right);
}
}
res.push_back(vtmp);
vtmp.clear();
len = qu.size();
}
return res;
}
};
int main()
{
system("pause");
return 0;
}