题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解题思路:
对于奇数层,它的(从左往右的)每个节点边输出边按左孩子、右孩子的顺序压栈,该层的下一个层为偶数层,弹栈时就是从右往左输出。
对于偶数层,它的(从右往左的)每个节点边输出边按右孩子、左孩子的顺序压栈,该层的下一个层为奇数层,弹栈时就是从左往右输出。
奇偶层需要用两个不同的栈。
画图很容易理解。
/*
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>> res;
if(pRoot==nullptr) return res;
int NowLevel=1;//1表示奇数层,-1表示偶数层
stack<TreeNode*> stack1,stack2;
stack1.push(pRoot);
while(stack1.size()||stack2.size()){
if(NowLevel==1){
vector<int> temp;
while(stack1.size()){
TreeNode* pNode=stack1.top();
stack1.pop();
temp.push_back(pNode->val);
if(pNode->left!=nullptr) stack2.push(pNode->left);
if(pNode->right!=nullptr) stack2.push(pNode->right);
}
if(temp.size()){
res.push_back(temp);
NowLevel*=-1;
}
}else{
vector<int> temp;
while(stack2.size()){
TreeNode* pNode=stack2.top();
stack2.pop();
temp.push_back(pNode->val);
if(pNode->right!=nullptr) stack1.push(pNode->right);
if(pNode->left!=nullptr) stack1.push(pNode->left);
}
if(temp.size()){
res.push_back(temp);
NowLevel*=-1;
}
}
}
return res;
}
};
下面这个时刚开始写的,错了。后来改正确了,思路很简单可还是不知道这个怎么错的。。。
经过一番肉眼debug终于肝出来错在哪了。。。对于最后一行,当两个栈所有元素都出栈,但此时最后一行还没保存进res,但最外层的while已经终止。所以无论如何最后一行无法输出。
/*
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>> res;
if(pRoot==nullptr) return res;
vector<int> temp;
int NowLevel=1;
stack<TreeNode*> stack1,stack2;
stack1.push(pRoot);
while(stack1.size()||stack2.size()){
if(NowLevel==1){
if(stack1.size()){
TreeNode* pNode=stack1.top();
stack1.pop();
temp.push_back(pNode->val);
if(pNode->left!=nullptr) stack2.push(pNode->left);
if(pNode->right!=nullptr) stack2.push(pNode->right);
}else{ //******************************************这里出问题
res.push_back(temp);
NowLevel*=-1;
vector<int> v;
temp=v;
}
}else{
if(stack2.size()){
TreeNode* pNode=stack2.top();
stack2.pop();
temp.push_back(pNode->val);
if(pNode->right!=nullptr) stack1.push(pNode->right);
if(pNode->left!=nullptr) stack1.push(pNode->left);
}else{ //******************************************这里出问题
res.push_back(temp);
NowLevel*=-1;
vector<int> v;
temp=v;
}
}
}
return res;
}
};