剑指Offer32-III.从上到下打印二叉树III
写在前面,小白从零刷题,在解答会写出思路,正确答案,以及所有使用到的语法和知识点
1.双端队列 3
- 双端队列 从左至右则正常从尾端放入,从前端出队,从右至左,则从前端反向放入,从后端出队
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>>ans;
deque<TreeNode*>q;
q.push_back(root);
bool flag=true;//使用bool型方便
if(q.front()==nullptr) return ans;
while(!q.empty()){
vector<int>res;
int size=q.size();
for(int i=0;i<size;i++){
if(flag){
TreeNode* node=q.front();
q.pop_front();
res.push_back(node->val);
if(node->left) q.push_back(node->left);
if(node->right) q.push_back(node->right);
}
else{
TreeNode* node=q.back();
q.pop_back();
res.push_back(node->val);
if(node->right) q.push_front(node->right);
if(node->left) q.push_front(node->left);
}
}
flag=!flag;
ans.push_back(res);
}
return ans;
}
};
2.reverse 反转 4
- 思路就是将队列送到vector内的数据进行反转
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>>ans;
queue<TreeNode*>q;
q.push(root);
int flag=0;
if(q.front()==nullptr) return ans;
while(!q.empty()){
vector<int>res;
int size=q.size();
for(int i=0;i<size;i++){
TreeNode* a=q.front();
q.pop();
res.push_back(a->val);
if(a->left) q.push(a->left);
if(a->right) q.push(a->right);
}
if(flag==1) {
reverse(res.begin(),res.end());
flag=0;
}
else flag=1;
ans.push_back(res);
}
return ans;
}
};
知识点
时间复杂度/空间复杂度分析/面试场景如何作答
双端队列
- 时间复杂度:O(n)所有树只进出一次
- 空间复杂度: 空间复杂度为O(n) 二维数组存储
reverse 反转
- 时间复杂度:o(2n)
- 空间复杂度:o(n)