1.题目
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
2.思路
本题使用两个栈作为辅助容器。打印某一层节点时,把下一层的子节点保存到栈内。如果当前打印的是奇数层,则先保存左子树节点再保存右子树节点到第一个栈内;如果当前打印的是偶数层,则先保存右子树在保存左子树节点到第二个栈内。
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
// 存储结果
vector<vector<int> > results;
vector<int> rlt_temp;
// 边界条件
if(pRoot == nullptr)
return results;
// 辅助容器
stack<TreeNode*> stk[2]; // stk[0]是奇数层,stk[1]是偶数层
int now = 0;
int next = 1;
TreeNode* temp=pRoot;
// 根节点入栈
stk[now].push(temp);
// 遍历两个栈,当两个栈均为空时,跳出循环
while(!stk[now].empty() || !stk[next].empty()){
// 存储遍历结果
temp = stk[now].top();
rlt_temp.push_back(temp->val);
stk[now].pop();
// 当前层是奇数或偶数
if(now==0)
{
// 当前层是奇数时,左子树先入栈,右子树后入栈
if(temp->left!=nullptr)
stk[next].push(temp->left);
if(temp->right!=nullptr)
stk[next].push(temp->right);
}
else
{
// 当前层是偶数时,右子树先入栈,左子树后入栈
if(temp->right!=nullptr)
stk[next].push(temp->right);
if(temp->left!=nullptr)
stk[next].push(temp->left);
}
// 当前层为空时,打印下一层
if(stk[now].empty())
{
results.push_back(rlt_temp);
rlt_temp.clear();
now=1-now;
next = 1-next;
}
}
return results;
}
};