题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
题目分析
主要是利用两个栈,一个栈存储从左到右的结点,打印出来是从右到左;另一个栈存储从右到左的结点,打印出来是从左到右。
详情请看注释。
代码
C++代码如下:
/*
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>> ans;
if(!pRoot)
return ans;
stack<TreeNode*> stack1;
stack<TreeNode*> stack2;
stack1.push(pRoot);
while(!stack1.empty()||!stack2.empty())
{
vector<int> ans1;
while(!stack1.empty())
{
//出栈顺序是从左到右时,将子节点也按从左到右的顺序压入stack2,这样stack2的出栈顺序就是从右往左
TreeNode* tmp=stack1.top();
stack1.pop();
ans1.push_back(tmp->val);
if(tmp->left)
stack2.push(tmp->left);
if(tmp->right)
stack2.push(tmp->right);
}
if(!ans1.empty()) ans.push_back(ans1);
ans1.clear();
while(!stack2.empty())
{
//出栈顺序是从右到左时,将子节点也按照从右到左的顺序压住stack1,这样stack1的出栈顺序就是从左往右
TreeNode* tmp=stack2.top();
stack2.pop();
ans1.push_back(tmp->val);
if(tmp->right)
stack1.push(tmp->right);
if(tmp->left)
stack1.push(tmp->left);
}
if(!ans1.empty()) ans.push_back(ans1);
ans1.clear();
}
return ans;
}
};