思路:建立两个栈,栈1是储存奇数层的,栈2是储存偶数层的。然后在打印某一层的时候记得把那一层的子节点储存到另一个栈就是了。比如
在打印奇数层的时候,就是相当于操作栈1,把栈1的节点一个个弹出来,并且把该层的每个节点按照左孩子,右孩子储存到栈2中,
而在打印偶数层节点的时候 ,把栈2的节点一个个弹出来,并且把该层的每个节点按照右孩子,左孩子储存到栈1中,
当两个栈,就是栈1和栈2都是空的时候程序退出,就是程序的打印结果完毕。
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
stack<TreeNode*>stack1;
stack<TreeNode*>stack2;
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> >res;
if(pRoot == nullptr)
return res;
stack1.push(pRoot);//第一层是奇数层,奇数层节点储存到栈1
bool flag = true;//判断打印那一层,true打印奇数层,false打印偶数层
while(!stack1.empty() || !stack2.empty() )
{
if(flag)//打印奇数层,就是把栈1的结果弹出来
{
vector<int>temp;
while(!stack1.empty() )
{
TreeNode * x = stack1.top();
temp.push_back (x ->val);
//按照左右孩子的顺序把子节点放到栈2中
if(x ->left)
stack2.push(x->left);
if(x -> right)
stack2.push(x ->right);
stack1.pop();
}
res.push_back (temp);//放到结果集中
flag = false;//改标志,表明下一次打印偶数层
}
else
{
vector<int>temp;
while(!stack2.empty() )
{
TreeNode * x = stack2.top();
temp.push_back (x -> val);
//按照右 左孩子的顺序把子节点放到栈1中
if(x ->right)
stack1.push(x -> right);
if(x -> left)
stack1.push(x -> left);
stack2.pop();
}
res.push_back (temp);
flag = true;//改标志,表明下一次打印奇数层
}
}
return res;
}
};