1. 题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
2. 题目分析
开始分析这道题时,我们先画出一个二叉树做示例就能看的比较清楚了。也就是奇数行是从左至右,偶数行是从右至左。
我们定义两个栈,stack1存储奇数行,stack2存储偶数行。现将根节点压入stack1,然后将其左右节点依次压进stack2,然后打印根节点(即根节点出栈);此时stack1空,stack2非空。
然后stack2的出栈顺序,在stack1中先压右节点,然后压左节点。
不断重复stack1,stack2间的压栈出栈,直至二者都变空为止。
3. 题目解答——cpp
/*
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> > answers;
if(pRoot == nullptr)
return answers;
stack<TreeNode*> stack1;
stack<TreeNode*> stack2;
stack1.push(pRoot);
while(!stack1.empty() || !stack2.empty()) {
if(!stack1.empty()){
vector<int> tmp;
while(!stack1.empty()) {
TreeNode* pNode = stack1.top();
stack1.pop();
tmp.push_back(pNode->val);
if(pNode->left != nullptr){
stack2.push(pNode->left);
}
if(pNode->right != nullptr){
stack2.push(pNode->right);
}
}
answers.push_back(tmp);
}
if(!stack2.empty()){
vector<int> tmp;
while(!stack2.empty()) {
TreeNode* pNode = stack2.top();
stack2.pop();
tmp.push_back(pNode->val);
if(pNode->right != nullptr){
stack1.push(pNode->right);
}
if(pNode->left != nullptr){
stack1.push(pNode->left);
}
}
answers.push_back(tmp);
}
}
return answers;
}
};
4. 总结
在这道题中我遇到了全局变量和局部变量定义的问题。希望以后自己能够在定义变量时,注意到全局变量和局部变量的区别。