给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
刚入门数据结构,掌握的少也不太好,加上比较笨结果这道题想了半天还是没有做出来,于是参(chao)考(xi)了一下别人的答案。
可以通过迭代的方法:我们设立一个队列,然后就类似于求一个数组的子集那样,我们先将root(当然要存在)节点的值加入到队列中,完成初始化,先看代码:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>>res;
queue<TreeNode*>q;
if (!root) {
return res;
}
q.push(root);//初始化
while (!q.empty()) {
vector<int>aLevel;
int size = q.size();//注意,此处取得的是当前队列的长度,而在迭代过程中q.size()是变化的
for (int i = 0;i < size;i++) {
TreeNode *node = q.front();
q.pop();
aLevel.push_back(node->val);
if (node->left) {
q.push(node->left);
}
if (node->right) {
q.push(node->right);
}
}
res.push_back(aLevel);
}
return res;
}
};
之后循环,条件当然是直到队列为空为止,然后设置一个一维的代表该层元素的数组,以及最重要的--当前队列中元素的数量len。比如说当前对应的某层有两个元素,即len=2,我们遍历它,并将每个元素的左、右节点加入到队列中,这样的话由于队列的先进先出性质,获得了下一层,len只关联到当前层的元素,不影响下一层元素。即各层所有节点的加入是相互独立的,当然对于Dequeue操作来说也是如此。
参考: