解法一
- 利用栈的后进先出,每次遍历每一层时简历一个栈来保存下一层的结点。
- 遍历奇数行的时候,让左节点先进栈(这样右节点先出)
- 遍历偶数行的时候,让右节点先进栈
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > ans;
if (!pRoot) return ans;
stack<TreeNode*> ctr;
ctr.push(pRoot);
TreeNode *p;
bool left = true;
while (!ctr.empty()){
int count = ctr.size();
vector<int> layer;
stack<TreeNode*> new_ctr;
for (int i = 0; i < count; i++){
p = ctr.top();
layer.push_back(p->val);
ctr.pop();
if (!left){
if (p->right) new_ctr.push(p->right);
if (p->left) new_ctr.push(p->left);
}
else{
if (p->left) new_ctr.push(p->left);
if (p->right) new_ctr.push(p->right);
}
}
left = !left;
ctr = new_ctr;
ans.push_back(layer);
}
return ans;
}
};
解法二
- idea:这就简单了,直接层次遍历,遍历偶数行的时候反向输入就可以
- code
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > ans;
if (!pRoot) return ans;
queue<TreeNode*> ctr;
ctr.push(pRoot);
TreeNode *p;
bool left = true;
while (!ctr.empty()){
int count = ctr.size();
int *tmp = new int[count];
for (int i = 0; i < count; i++){
p = ctr.front();
ctr.pop();
if (p->left){
ctr.push(p->left);
}
if (p->right){
ctr.push(p->right);
}
if (left) tmp[i] = p->val;
else tmp[count-1-i] = p->val;
}
vector<int> layer(tmp, tmp+count);
delete [] tmp;
left = !left;
ans.push_back(layer);
}
return ans;
}
};