题目:
链接:剑指 Offer 32 - III. 从上到下打印二叉树 III
难度:中等
上一题博文:剑指 Offer 32 - II. 从上到下打印二叉树 II(LeetCode 102. 二叉树的层序遍历)(BFS层序遍历变形)
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7],
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
提示:
节点总数 <= 1000
解题思路:
BFS广度优先遍历(二叉树层序遍历)的变形。相比前一题剑指 Offer 32 - II. 从上到下打印二叉树 II(LeetCode 102. 二叉树的层序遍历)(BFS层序遍历变形),又增加了层次遍历中翻转输出的处理,可以用数组翻转,也可以借用STL容器双端队列deque实现。
代码:
/**
* 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:
void swapArr(vector<int> &arr) { //翻转数组
for(int i = 0, size = arr.size(); i < size/2; i++)
{
swap(arr[i], arr[size-1-i]);
}
}
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
if(root == nullptr) return ans;
queue<TreeNode*> q;
bool order = true;
q.emplace(root);
while(!q.empty()) {
vector<int> temp;
int size = q.size();
while(size--) {
TreeNode* node = q.front();
temp.emplace_back(node->val);
if(node->left != nullptr) q.emplace(node->left);
if(node->right != nullptr) q.emplace(node->right);
q.pop();
}
if(!order) swapArr(temp); //根据order标志决定输出的左右顺序
order = !order;
ans.emplace_back(temp);
}
return ans;
}
};
//或者用双端队列deque代替数组翻转,改写为:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
if(root == nullptr) return ans;
queue<TreeNode*> q;
bool order = true;
q.emplace(root);
while(!q.empty()) {
deque<int> temp;
int size = q.size();
while(size--) {
TreeNode* node = q.front();
if(order) temp.emplace_back(node->val); //根据order标志决定输出的左右顺序
else temp.emplace_front(node->val);
if(node->left != nullptr) q.emplace(node->left);
if(node->right != nullptr) q.emplace(node->right);
q.pop();
}
order = !order;
ans.emplace_back(vector<int>{temp.begin(), temp.end()});
}
return ans;
}
};
时间复杂度O(n),空间复杂度O(n)。