请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
题目咋一看,很简单,可是实现起来还是有不少要注意的细节,最关键的是奇数层和偶数层要进行区分。我的方法就是每一次都是直接压入队列的方法,咋一听和我们层序遍历一模一样,对的,确实是一模一样,不同的是出队的时候把所有节点压入到一个数组中,当则一层是偶数层时翻转数组即可,实现代码也比较简单,判断当前层是那一层的方法也是三个计数变量控制,这个方法也比较重要,需要掌握。但是牛客网友真是各路人马大显神通,学习下别人的实现方式和代码风格,也是着实重要,剑还是那把剑,招法当然是越多越好!!
先上一段自己AC的代码(楼主的放第一个有什么问题吗-_-)
/*
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> >ans;
vector<int>s;
queue<TreeNode*>q;
int i=1;
if(pRoot==NULL)
return ans;
q.push(pRoot);
TreeNode* p;
int num,cur,end,level;
num=1;//记录节点序号
cur=0;//当前访问到的节点序号
end=1;//层序遍历当前层的最后一个元素序号
level=1;
while(!q.empty())
{
p=q.front();
q.pop();
cur++;
s.push_back(p->val);
if(p->left)
{
num++;
q.push(p->left);
}
if(p->right)
{
num++;
q.push(p->right);
}
if(cur==end)
{
end=num;//重新定义最后的节点
if(level%2==0)
std::reverse(s.begin(),s.end());
ans.push_back(s);
s.clear();
level++;//好了,我们开始遍历下一层了
}
}
return ans;
}
};
我的启发式代码,来自牛客网acman07用户
只想说:这代码写得挺好看!!!
链接:https://www.nowcoder.com/questionTerminal/91b69814117f4e8097390d107d2efbe0
来源:牛客网
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> res;
if(pRoot == NULL)
return res;
queue<TreeNode*> que;
que.push(pRoot);
bool even = false;
while(!que.empty()){
vector<int> vec;
const int size = que.size();
for(int i=0; i<size; ++i){
TreeNode* tmp = que.front();
que.pop();
vec.push_back(tmp->val);
if(tmp->left != NULL)
que.push(tmp->left);
if(tmp->right != NULL)
que.push(tmp->right);
}
if(even)
std::reverse(vec.begin(), vec.end());
res.push_back(vec);
even = !even;
}
return res;
}
};
有些java的也写得挺不错,为了不那么不伦不类就不贴了。。。。