详见注释
class Solution {
public:
//核心思路使用了一个队列一个栈。队列是层序遍历常用的,不多赘述。
//如果不使用栈的话,我们只能做到对每个节点的子节点进行方向转换。
//而题目的要求是要对一整层都进行方向的转换。
vector<vector<int> > Print(TreeNode* pRoot) {
queue<TreeNode*> BQueue;
stack<TreeNode*> BStack;
vector<vector<int> >result;
vector<int>OneLayer;
//true代表本行是从左往右,false代表从右往左。
//本行是从左往右,将子结点入栈时自然也是先左后右,弹出时方向自然就反了。
bool direction=true;
if(pRoot==NULL)
return result;
//这层的每一个节点视为一个父节点,下一层的每一个节点视为一个子节点。
int parents=1;
int children=0;
BQueue.push(pRoot);
while(!BQueue.empty())
{
TreeNode* Current=NULL;
//出队一个父结点
Current=BQueue.front();
OneLayer.push_back(Current->val);
BQueue.pop();
parents--;
//将这个父节点的子节点入栈,方向由direction控制。
//true为先左后右
if(direction==true){
if(Current->left!=NULL){
BStack.push(Current->left);
children++;
}
if(Current->right!=NULL){
BStack.push(Current->right);
children++;
}
}//false:先右后左。
else{
if(Current->right!=NULL){
BStack.push(Current->right);
children++;
}
if(Current->left!=NULL){
BStack.push(Current->left);
children++;
}
}
//如果这一层的节点都出队(处理)完了,就要开始进入下一层了。
if(parents==0)
{
//下一层的方向改变。
direction=(direction==true)? false:true;
//到了下一层后,原本的子节点变成了新的父节点。
parents=children;
children=0;
//将这一层的打印结果保存起来。
result.push_back(OneLayer);
OneLayer.clear();
//将栈中的内容倾倒队列,即将下一层的子节点入队。
while(!BStack.empty())
{
BQueue.push(BStack.top());
BStack.pop();
}
}
}
return result;
}
};

京公网安备 11010502036488号