力扣102题。比较简单的一道二叉树遍历。
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
思路:
利用队列,每次先记录此时队列长度,然后确定每层vector的个数。
然后遍历,加入到新创建的那一层vector即可。
代码如下
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(!root)
return res;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
int len=q.size();
res.push_back(vector<int> ()); //添加一层
for(int i=1;i<=len;i++){
TreeNode* node=q.front();
q.pop();
res.back().push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
}
return res;
}
但是这道题当时我出错了,看了好久才找出 原因。原因是将queue的长度确定写在了for循环中。
for(int i=1;i<=q.size();i++){
TreeNode* node=q.front();
q.pop();
res.back().push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
但其实在循环中q的长度改变了,这样i的终止条件就会变化,然后出错。
就还是要注意一些细节,避免坏习惯养成。