从上到下打印二叉树(之字形)
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
提示:
- 节点总数 <= 1000
解法: 此题要比前面两道题目要复杂点,创建两个栈,根据奇数和偶数行,使用不同的交替入栈策略,即可达到之字形的效果。
遇到的问题: 没有想到创建一个栈数组,和两个整数来指定偶数行和奇数行。
/**
* 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(0,vector<int>(0,0)); // 确定返回值
stack<TreeNode*> level[2];
vector<vector<int> > result;
int current = 0;
int next = 1;
vector<int> temp;
level[current].push(root);
while(!level[0].empty() || !level[1].empty()){
if(current == 0){ // 当前是奇数行
temp.push_back(level[current].top()->val);
if(level[current].top()->left != nullptr)
level[next].push(level[current].top()->left);
if(level[current].top()->right != nullptr)
level[next].push(level[current].top()->right);
level[current].pop();
} else{ // 当前是偶数行
temp.push_back(level[current].top()->val);
if(level[current].top()->right != nullptr)
level[next].push(level[current].top()->right);
if(level[current].top()->left != nullptr)
level[next].push(level[current].top()->left);
level[current].pop();
}
if(level[current].empty()){
current = 1 - current; // 轮流指定两个栈
next = 1 - next;
result.push_back(temp);
temp.clear();
}
}
return result;
}
};