按之字形顺序打印二叉树
题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解题思路
- 因为是按照之字形打印,所以要用栈。如果是层序打印,用到的是队列
- 每次
从左到右
遍历的时候,把下一层的节点按照左-右
的顺序入栈,这样就能够实现下层节点以右-左
的顺序出栈 - 每次
从右到左
遍历的时候,把下一层的节点按照右-左
的顺序入栈,这样就能够实现下层节点以左-右
的顺序出栈 - 遍历每一层的节点存储在临时数组
temp
中,每遍历完一层,就将其加入到结果中,实现之字形打印
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > ans;
if(pRoot==NULL) return ans;
vector<int>temp;
//需要两个栈
stack<TreeNode *>st[2];
int cur=0,next=1;
st[cur].push(pRoot);
while(!st[cur].empty() || !st[next].empty()){
TreeNode *now=st[cur].top();
st[cur].pop();
temp.push_back(now->val);
if(cur==0){//cur和next交替,以此判断当前打印方向
//往下一层的栈中push,当前层是从左到右,下一层是从右到左,按左-右的顺序入栈
if(now->left) st[next].push(now->left);
if(now->right) st[next].push(now->right);
}else{
//当前是从右到左,下一层是从左到右,所以按右-左的顺序入栈,就能实现左-右的出栈顺序
if(now->right) st[next].push(now->right);
if(now->left) st[next].push(now->left);
}
//遍历完当前层以后,该层节点放入结果中
if(st[cur].empty()){
ans.push_back(temp);
temp.clear();
cur=1-cur; //当前栈空了,换下一个栈为当前栈
next=1-next;
}
}
return ans;
}
};