题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
leetcode对应题目:103. 二叉树的锯齿形层次遍历 题目解答
总结:层序遍历加双栈,因为看到这个顺序反过来,一下就想到用栈(尴尬!误打误撞!)。要注意存入顺序变化!第二行从右至左的打印,所以存入的时候从左到右存入;第三行则从右到左存入。
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
if(!pRoot) return {};
stack<TreeNode*> s1;s1.push(pRoot);
stack<TreeNode*> s2;
vector<vector<int>> res;
vector<int> out;
while(!s1.empty() || !s2.empty()){
while(!s1.empty()){
TreeNode* q = s1.top();
s1.pop();
out.push_back(q->val);
if(q->left) s2.push(q->left);
if(q->right) s2.push(q->right);
}
//两个栈交替进行,如果数组为空,就不要放在结果中。
if(!out.empty()){
res.push_back(out);
out.clear();
}
while(!s2.empty()){
TreeNode* q = s2.top();
s2.pop();
out.push_back(q->val);
if(q->right) s1.push(q->right);
if(q->left) s1.push(q->left);
}
if(!out.empty()){
res.push_back(out);
out.clear();
}
}
return res;
}
};
用队列也可以做
class Solution {
public:
vector<vector<int>> Print(TreeNode* pRoot) {
if (!pRoot) return{};
vector<vector<int>> output;
deque<TreeNode*> p1, p2;
p1.push_back(pRoot);
while (p1.size() || p2.size()) {
vector<int> level1;
while (p1.size()) {
TreeNode* t = p1.front(); p1.pop_front();
level1.push_back(t->val);
if (t->left) p2.insert(p2.begin(), t->left);
if (t->right) p2.insert(p2.begin(), t->right);
}
if(level1.size()) output.push_back(level1);
vector<int> level2;
while (p2.size()) {
TreeNode* t = p2.front(); p2.pop_front();
level2.push_back(t->val);
if (t->right) p1.insert(p1.begin(), t->right);
if (t->left) p1.insert(p1.begin(), t->left);
}
if (level2.size()) output.push_back(level2);
}
return output;
}
};