Acy夕拾算法 Week1_day6
LeetCode 102. 二叉树的层序遍历
/*代码随想录
整理思路:
每层要如何保存?哪层的?如何保存遍历过的元素的子节点?
借助队列保存每层遍历过的元素 和 对应的子节点,先进先出
放入根节点,记录当队列size大小,弹出一个 size --,同时加入它的子节点
size=0时,重新记录队列的size
每层一个数组,记录完再一起push_back
输入为空时,记得判断
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == nullptr) return {};
int size;
queue<TreeNode*> node_que;
vector<vector<int>> res;
node_que.push(root);
while( !node_que.empty() )//不是对节点判断,而是队列
{
size = node_que.size();
vector<int> level_res;
while(size--)
{
TreeNode* node = node_que.front();
if(node != nullptr)
{
level_res.push_back(node->val);
node_que.pop();
if(node->left) node_que.push(node->left);
if(node->right) node_que.push(node->right);
}
}
res.push_back(level_res);
}
return res;
}
};
LeetCode 107. 二叉树的层序遍历 II
/*
整理思路:
还是 前序遍历放入队列,但答案先以层为单位放入栈,再从栈弹出放入vector—实现倒叙;
leetcode官方:用102的代码,最后reverse(res.begin(), res.end());实现倒叙。
*/
用栈倒序
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
if(root == nullptr) return {};
int size;
vector<vector<int>> res;
stack<vector<int>> stack_res;//比102多加了个栈
queue<TreeNode*> node_que;
node_que.push(root);
while( !node_que.empty() )
{
vector<int> level_res;
size = node_que.size();
while(size--)
{
TreeNode* node = node_que.front();
level_res.push_back(node->val);
node_que.pop();
if(node->left) node_que.push(node->left);
if(node->right) node_que.push(node->right);
}
stack_res.push(level_res);//先放入栈
}
while(!stack_res.empty())
{
res.push_back(stack_res.top());//再从栈弹出到数组
stack_res.pop();
}
return res;
}
};
用reverse()
102代码最后加一个reverse()
res.push_back(level_res);
}
reverse(res.begin(), res.end());//最后加一个reverse即可
return res;
}
};
LeetCode 199. 二叉树的右视图
/*
我的思路:
题目意思,即 只返回每层的最右侧的节点。
方法一-1:还是102,前序遍历,覆盖着存值-------不优美
方法一-2:已知了每层的size,size==0时即为最后一次遍历,此时的节点即为最后右节点,返回其值
方法二:DFS
*/
//方法一-2
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
if(root == nullptr) return {};
int size;
vector<int> res;
queue<TreeNode*> node_que;
node_que.push(root);
while( !node_que.empty() )
{
size = node_que.size();
// int num_res;
while(size--)
{
TreeNode* node = node_que.front();
// num_res = node->val;
if(size == 0)//最右
res.push_back(node->val);
node_que.pop();
if(node->left) node_que.push(node->left);
if(node->right) node_que.push(node->right);
}
// res.push_back(num_res);
}
return res;
}
};

被折叠的 条评论
为什么被折叠?



