【LeetCode-树】从上到下打印二叉树 III
题目描述
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
示例:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
题目链接: https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/
思路
本题就是《剑指Offer》上的之字形打印二叉树。方法如下:
记录当前是第几层:
- 奇数层:节点前取后放,先放左子节点,再放右子节点(常规的 BFS 方式);
- 偶数层:节点后取前放,先放右子节点,再放左子节点(与奇数层相反);
由于使用到了队列的前取后放和后取前放,所以不能使用 STL 常规的 queue,可以使用双端队列 deque,双端队列的操作如下:
- q.front():获取队头元素;
- q.pop_front():删除队头元素;
- q.back():获取队尾元素;
- q.pop_back():删除队尾元素;
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root==nullptr) return {};
vector<vector<int>> ans;
deque<TreeNode*> q;
q.push_back(root);
int curLevel = 1;
while(!q.empty()){
vector<int> v;
int n = q.size();
for(int i=0; i<n; i++){
if(curLevel%2!=0){
TreeNode* node = q.front(); q.pop_front();
v.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();
v.push_back(node->val);
if(node->right) q.push_front(node->right);
if(node->left) q.push_front(node->left);
}
}
ans.push_back(v);
curLevel++;
}
return ans;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(n)