102. 二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
前台样例
示例:
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
二叉树结构
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
解读题目:
题目意思简单明了,主要注意一点,返回的是int型的二维vector。
也就是说,不是需要返回点,而是返回点的val,同时注意按层次返回。
所以可以思考到当二叉树很高时如果开辟二维数组来存很可能额外消耗很多空间。
即考虑长度不一样的行。
解题思路:
用队列来存储层次结构实现遍历
这里直接copy题解了,写的蛮清晰的。
对于下面的样例树
3
/ \
9 20
/ \
15 7
先入队 3,队列 [3]
然后 3 出队,入队 3 的左右结点 9 20,队列 [9 20]
然后 9 出队,入队 9 的左右结点,没有就跳过,队列 [20]
然后 20 出队,入队 20 的左右结点 15 7,队列 [15 7]
所以每一层操作完之后队列就变成了下一层的元素。
所以可以保证 q.size() 就是当前层的元素的数目,直接循环遍历就可以了。
AC代码 4ms/12MB
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root==NULL) return {};
queue<TreeNode*>qNode;
vector<vector<int>> ans;
qNode.push(root);
while(!qNode.empty())
{
vector<int> tempans;
int len=qNode.size();
for(int i=0;i<len;i++)
{
TreeNode*temp=qNode.front();
tempans.push_back(temp->val);
qNode.pop();
if(temp->left!=NULL) qNode.push(temp->left);
if(temp->right!=NULL) qNode.push(temp->right);
}
ans.push_back(tempans);
tempans.clear();
}
return ans;
ans.clear();
}
};
该题到这里就结束了,下面开一篇新文补充记录一下vector容器与队列的基本使用。