牛客网剑指offer第59题——按之字形顺序打印二叉树

题目:

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

思路:这个题目是典型的按行打印二叉树,但是不同于之前都是从左至右打印那种顺序(都是从左至右的是使用栈)。这个题目的本质是:下一次的打印都是倒叙的,基于这个特征,我们定义两个栈:一个栈用于存储奇数行节点,一个栈用于存储偶数行节点。

比如我们在打印第一行的节点时(stack1出栈),将第二行按照从左至右的顺序入栈(stack2入栈);那么当我们打印第二行的时候(stack2出栈),就是从右至左的顺序打印;当我们从右至左打印第二行的时候,将关联的第三行子节点从右至左入栈(stack1入栈),则当我们打印第三行时(stack1出栈),就又是从左至右的顺序.....

代码:

/*
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> >res;
        //用双栈的思路能够清晰的解决这个问题:
        if(pRoot == nullptr)
            return res;
        stack<TreeNode*> odd_level;//stack1
        stack<TreeNode*> even_level;//stack2
        odd_level.push(pRoot);
        while((!odd_level.empty()) || (!even_level.empty()))
        {
            if(!odd_level.empty())
            {
                vector<int> midres;
                while(!odd_level.empty())
                {
                    TreeNode*topNode = odd_level.top();
                    odd_level.pop();
                    midres.push_back(topNode->val);
                    if(topNode->left != nullptr)
                        even_level.push(topNode->left);
                    if(topNode->right != nullptr)
                        even_level.push(topNode->right);
                }
                res.push_back(midres);
            }
            else if(!even_level.empty())
            {
                vector<int> midres;
                while(!even_level.empty())
                {
                    TreeNode*topNode = even_level.top();
                    even_level.pop();
                    midres.push_back(topNode->val);
                    if(topNode->right != nullptr)
                        odd_level.push(topNode->right);
                    if(topNode->left != nullptr)
                        odd_level.push(topNode->left);
                }
                res.push_back(midres);
            }
        }
        return res;
    }
};
原文地址:https://www.cnblogs.com/shaonianpi/p/12691841.html