之字型打印二叉树(当年PAT跪了的题目,从大同见小异)

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
题目咋一看,很简单,可是实现起来还是有不少要注意的细节,最关键的是奇数层和偶数层要进行区分。我的方法就是每一次都是直接压入队列的方法,咋一听和我们层序遍历一模一样,对的,确实是一模一样,不同的是出队的时候把所有节点压入到一个数组中,当则一层是偶数层时翻转数组即可,实现代码也比较简单,判断当前层是那一层的方法也是三个计数变量控制,这个方法也比较重要,需要掌握。但是牛客网友真是各路人马大显神通,学习下别人的实现方式和代码风格,也是着实重要,剑还是那把剑,招法当然是越多越好!!
先上一段自己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的也写得挺不错,为了不那么不伦不类就不贴了。。。。

猜你喜欢

转载自blog.csdn.net/kellen_f/article/details/79059930
今日推荐