一、题目
二、思路
按层打印二叉树,很容易想到的是用层次遍历,由于相邻两层的结点打印顺序是相反的(若上一次是从左往右,则下一层为从右往左),比较直接的做法是用两个栈实现,因为栈可以实现逆序,一个栈从左往右保存当前层结点,另一个栈从右往左保存下一层结点,再次逆序之后间隔一层的两个层之间的顺序又变为相同,用一个变量flag来标识当前层应该对哪个栈进行处理。
三、代码
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> ans;
if(pRoot == NULL) return ans;
stack<TreeNode*> st1; //两个栈交替各层结点
stack<TreeNode*> st2;//若当前层是st1保存,则下一层为st2保存
bool flag = true; //标识是哪个栈保存着节点
st1.push(pRoot);
while(!st1.empty() || !st2.empty()){ //每次循环处理一层
vector<int> layer; //当前层的结点值
if(flag){ //st1中保存着结点
int num1 = st1.size();
for(int i=0; i<num1; i++){
TreeNode* tmp = st1.top();
layer.push_back(tmp->val);
if(tmp->left) //从左往右处理
st2.push(tmp->left);
if(tmp->right)
st2.push(tmp->right);
st1.pop();
}
}
else{ //st2中保存着当前层结点
int num2 = st2.size();
for(int j=0; j<num2; j++){
TreeNode* tmp = st2.top();
layer.push_back(tmp->val);
if(tmp->right) //从右往左处理
st1.push(tmp->right);
if(tmp->left)
st1.push(tmp->left);
st2.pop();
}
}
ans.push_back(layer);
flag = !flag; //转换为另一个栈处理节点
}
return ans;
}
};
四、运行结果