LeetCode 102: 二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
DFS 递归
class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> levelOrder(TreeNode* root)
{
addVector(root,0); //调用递归函数
return res;
}
void addVector(TreeNode* root,int level)
{
if(root == NULL) return;
if(res.size()==level) res.resize(level+1);
//level表示层数,也对应二维数组的第一层索引
res[level].push_back(root->val);
addVector(root->left,level+1);
addVector(root->right,level+1);
}
};
单队列+计数
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if (root == NULL) return {};
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
vector<int>level; //存放每一层的元素值
int count=q.size(); //队列大小表示当前层数的元素个数
while(count--) //count--逐个对该层元素进行处理
{
TreeNode *t=q.front();
q.pop();
level.push_back(t->val);
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
res.push_back(level); //将当层元素的vector加入res中
}
return res;
}
自己的代码(57% 100%)
思路:双队列
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == NULL) return {};
vector<vector<int>> res;
TreeNode *temp = root;
queue<TreeNode *> s1;
s1.push(temp);
while(!s1.empty()){
queue<TreeNode *> s2;
vector<int> re;
while(!s1.empty()){
temp = s1.front();
re.push_back(temp->val);
s1.pop();
if(temp->left!=NULL) s2.push(temp->left);
if(temp->right!=NULL) s2.push(temp->right);
}
res.push_back(re);
s1=s2;
}
return res;
}