剑指 Offer 32 - III. 从上到下打印二叉树 III
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
注意本题奇数行和偶数行打印的顺序不一样
代码:
Python 中使用 collections 中的双端队列 deque() ,其 popleft() 方法可达到 O(1)O(1) 时间复杂度;列表 list 的 pop(0) 方法时间复杂度为 O(N)O(N) 。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> vec;
if(root == nullptr)
return vec;
deque<TreeNode*> d;
d.push_front(root);
while(!d.empty())
{
vector<int> vec1;
int a = d.size();
for(int i=0; i<a; i++)
{
TreeNode* tmp = d.front();
d.pop_front();
if(vec.size()%2 ==0)
vec1.push_back(tmp->val);
else
vec1.insert(vec1.begin,tmp->val)
if(tmp->left)
d.push_back(tmp->left);
if(tmp->right)
d.push_back(tmp->right);
}
vec.push_back(vec1);
}
return vec;
}
};
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == NULL)
return {};
vector<vector<int>> ans;
queue<TreeNode*> que;
que.push(root);
int k = 1;
while(!que.empty())
{
int n = que.size();
vector<int> temp;
for(int i = 0; i < n; i ++)
{
TreeNode* node = que.front();
que.pop();
temp.push_back(node -> val);
if(node -> left != NULL)
que.push(node -> left);
if(node -> right != NULL)
que.push(node -> right);
}
if(k % 2 == 0)
reverse(temp.begin(), temp.end());
k ++;
ans.push_back(temp);
}
return ans;
}
};