题解
方法1:双队列遍历
主要思路
将头节点放入一个队列中,另一个队列为空。遍历存在数据的哪个队列,将其子节点放入到另一个空队列中,循环往复直到两个队列都为空。
源代码:c++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
vector<TreeNode*> que[2];
int slove_index = 0;
//如果不是一个空树就把根节点压入一个队列中
if(root != nullptr)
que[0].push_back(root);
while(1)
{
if(que[slove_index].size() == 0)
break;
//初始化
vector<int> thisFloot;
que[(slove_index + 1) % 2].clear();
//开始遍历,对每个节点的叶子压入另一个队列中,同时把节点的值放入结果中
for(int i = 0; i < que[slove_index].size(); i++)
{
thisFloot.push_back(que[slove_index][i]->val);
if(que[slove_index][i]->left != nullptr)
que[(slove_index + 1) % 2].push_back(que[slove_index][i]->left);
if(que[slove_index][i]->right != nullptr)
que[(slove_index + 1) % 2].push_back(que[slove_index][i]->right);
}
// 保存遍历数据,切换下一轮需要遍历的队列
result.push_back(thisFloot);
slove_index = (slove_index + 1)%2;
}
return result;
}
};
时空复杂度
- 用时:8 ms, 在所有 C 提交中击败了23.12%的用户
- 内存:12.2 MB, 在所有 C 提交中击败了68.86%的用户
中途错误记录
- 缺少了对空树的特殊处理(传入参数是空指针)
if(root != nullptr)
que[0].push_back(root);
一种优化方法
通过记录遍历前队列的长度,可以将两个队列合并成一个队列进行处理,一下代码来自LeetCode
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
if(root==NULL) return ans;
vector<int> level;
queue<TreeNode*> que;
que.push(root);
while(que.size()){
int size=que.size();
while(size--){
root=que.front();
level.push_back(root->val);
que.pop();
if(root->left) que.push(root->left);
if(root->right) que.push(root->right);
}
ans.push_back(level);
level.clear();
}
return ans;
}
};