1. 二叉树的层序遍历I
1.1 使用队列模拟
LeetCode链接: link.
解题思路:①用一个队列模拟,一层层的进入,一层层的出
- 如果是空树直接返回
- 层序遍历需要用到队列,定义一个队列,里面放置节点的地址,将根节点如队列
- 队列非空时,循环进行一下操作:
a. 队列中当前元素都是在同一层的,依次取出遍历,保存到同一个vector中
取到一个节点时候:
1. 保存该节点
2. 如果该节点左子树存在,将该左子树入队列
3. 如果该节点右子树存在,将该节点右子树入队列
4. 将当前已遍历节点从队列中拿出来
b. 本层节点遍历结束后,保存到返回的vector中,此时下一层节点已经全部入队列
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> vv;
if(root == nullptr)
return vv;
queue<TreeNode*> q;
q.push(root);
while(!q.empty())
{
int levelSize =q.size(); //获取当前层的数据个数
//一层层出,并且把下一层的结点都入到队列
//当前层出完以后,队列中存的就是下一层的所有结点
vector<int> v;
while(levelSize--)
{
TreeNode* front = q.front();
q.pop();
v.push_back(front->val);
//此时应该在队列中添加下一层的结点
if(front->left)
q.push(front->left);
if(front->right)
q.push(front->right);
}
vv.push_back(v);
}
return vv;
}
};
1.2 使用两个数组模拟
解题思路:②使用两个数组,curV来保存当前层的结点,nextV用来保存下一层的结点
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> vv;
if(root == nullptr)
return vv;
vector<TreeNode*> curV;
vector<TreeNode*> nextV;
curV.push_back(root);
//迭代的条件可以先放下,我们先进行单步的分析
while(!curV.empty())
{
//这里先进行单步的分析
vector<int> v;
for(auto e : curV)
{
v.push_back(e->val);
if(e->left)
nextV.push_back(e->left);
if(e->right)
nextV.push_back(e->right);
}
vv.push_back(v);
//此时开始考虑迭代的问题
//需要让nextV的数组覆盖掉curV数组中的内容,怎样做才是效率最高的。
//这里就相当于把数组的位置进行了调换
curV.swap(nextV);
nextV.clear();
}
return vv;
}
};
2. 二叉树的层序遍历II
LeetCode第107题—二叉树的层序遍历II链接: link.
这道题和上面的题思想一致,就是需要在把vector<vector< int>> 里面的vector< int>进行reverse逆置就可以了。
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> vv;
if(root == nullptr)
return vv;
vector<TreeNode*> curV;
vector<TreeNode*> nextV;
curV.push_back(root);
//写到最后就会发现,这个迭代的条件是什么,我把curV和nextV的数组进行了交换,此时curV位置是nextV数组的东西,
//换上来如果这个是空,就表示结束了
while(!curV.empty())
{
//先进行单步的编写,然后在进行迭代的写法
vector<int> v;
for(auto e : curV)
{
v.push_back(e->val);
if(e->left)
nextV.push_back(e->left);
if(e->right)
nextV.push_back(e->right);
}
vv.push_back(v);
//此时应该进行数组的覆盖,但是为了能够提高效率,应该考虑交换后在清空的方式
curV.swap(nextV);
nextV.clear();
}
//此时我们再把vector<vector<int>> 里面的vector<int>进行逆置
reverse(vv.begin(),vv.end());
return vv;
}
};