LeetCode 102. 二叉树的层次遍历(使用和不使用队列)
使用队列
1)使用队列的方法,先创建一个队列并且将二叉树根节点插入到队列中
2)利用根节点带出根节点的左右节点,分别插入到队列中,根节点的值输出到vector中
3)同理,利用上次队列中的所有节点,分别带出各自的左右节点,并且自身输出到vector中
4)利用这种方法就可实现每次循环将一层的数据按照从左到右的顺序添加到vector中,并且带出下一层的所有节点,注意:空节点不会被添加到对列中
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ret;
if (root == nullptr)
return ret;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int size = q.size();
vector<int> v;
while (size--) {
TreeNode* f = q.front();
q.pop();
v.push_back(f->val);
if (f->left != nullptr)
q.push(f->left);
if (f->right != nullptr)
q.push(f->right);
}
ret.push_back(v);
}
return ret;
}
};
不使用队列
不使用队列的方法和使用队列的方法基本一致,只不过用 vector 来模仿一个 queue,头删表示出队列,尾插表示入队列,其他思想一致
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ret;
if (root == nullptr)
return ret;
//vector<TreeNode*> 充当队列来使用
vector<TreeNode*> q;
q.push_back(root);
while (!q.empty()) {
vector<int> v;
int size = q.size();
while (size--) {
TreeNode* f = q[0];
q.erase(q.begin());
v.push_back(f->val);
if (f->left != nullptr)
q.push_back(f->left);
if (f->right != nullptr)
q.push_back(f->right);
}
ret.push_back(v);
}
return ret;
}
};