剑指offer:按之字形顺序打印二叉树

题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

思路

和打印成多行差不多,层次遍历,用一个变量记录一下每层的结点数目,把每层的结点单独存在一个vector里,最后放在结果里不同在于这次是之字形,用两个栈来代替队列,一个栈从每层的左面开始入栈,出栈的时候就是输出从右往左顺序,另一个从每层的右往左入栈,出栈的时候则输出从左往右顺序

code

/*
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) {
        stack<TreeNode*>odd;
        stack<TreeNode*>even;
        vector<int>layer;
        vector<vector<int>>res;
        if(pRoot==nullptr)
            return res;
        int i=1,qs=0;
        odd.push(pRoot);
        while(!odd.empty()||!even.empty()){
            if(i%2==1){
                qs=odd.size();
                while(qs--){
                    layer.push_back(odd.top()->val);
                    if(odd.top()->left)
                        even.push(odd.top()->left);
                    if(odd.top()->right)
                        even.push(odd.top()->right);
                    odd.pop();
                }
            }else if(i%2==0){
                qs=even.size();
                while(qs--){
                    layer.push_back(even.top()->val);
                    if(even.top()->right)
                        odd.push(even.top()->right);
                    if(even.top()->left)
                        odd.push(even.top()->left);
                    even.pop();
                }

            }
            res.push_back(layer);
            layer.clear();
            i++;
        }
        return res;
    }

};

猜你喜欢

转载自blog.csdn.net/qq_33278461/article/details/80056868
今日推荐