题目描述:
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解题思路:
从题目分析可知,题目的意思是:从上到下,单数行从左到右打印,双数行从右到左打印,这就需要我们在求解过程中要记住当前打印的是单数行还是奇数行。
考虑设置两个辅助栈空间,分别用于存放单数行的数据和双数行的数据,根据层序遍历的思想:遍历某一行时,可以直接将下一行的内容缓存,由此得到处理流程思路:
对上面这个二叉树:
初始化1入单行栈,1出栈时,需要将1按照左节点进栈、右节点进展的顺序,将其子节点压入双行栈,这样后续双行栈出栈时,出栈顺序为从右到左。
双行栈出栈时,同样边出栈,边将子节点入单行栈,但是入栈顺序是:先入右节点,再入左节点,这样后续单行栈出栈时,出栈顺序为从左到右。
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> res;
if(pRoot == NULL)
return res;
stack<TreeNode*> s_single;//临时存放单层的数据
stack<TreeNode*> s_double;//临时存放双层的数据
//初始为1层
int layer = 1;
s_single.push(pRoot);
while(!s_single.empty() || !s_double.empty()){
//双层
if(layer%2 != 0){
vector<int> v_single;
while(!s_single.empty()){
TreeNode* tmp = s_single.top();
v_single.push_back(tmp->val);
s_single.pop();
if(tmp->left){
s_double.push(tmp->left);
}
if(tmp->right){
s_double.push(tmp->right);
}
}
res.push_back(v_single);
layer++;
}
//单层
else{
vector<int> v_double;
while(!s_double.empty()){
TreeNode* tmp = s_double.top();
v_double.push_back(tmp->val);
s_double.pop();
if(tmp->right){
s_single.push(tmp->right);
}
if(tmp->left){
s_single.push(tmp->left);
}
}
res.push_back(v_double);
layer++;
}
}
return res;
}
};