题目描述

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

思路解析:

用两个栈存储每一行的数据,从左向右顺序用一个栈存储,将栈中元素弹出时,元素的子节点存入从右向左顺序的栈,该栈元素弹出时,再次存入从左向右顺序的栈,直到两个栈都为空,所有节点全部访问完成。

/*
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==NULL)
            return res;
        stack<TreeNode*>RtoL;
        stack<TreeNode*>LtoR;
        TreeNode* point;
        vector<int>tmp;
        LtoR.push(pRoot);
        while(!LtoR.empty()||!RtoL.empty())
        {
            while(!LtoR.empty())
            {
                point=LtoR.top();
                LtoR.pop();
                tmp.push_back(point->val);
                
                if(point->left!=NULL)
                    RtoL.push(point->left);
                if(point->right!=NULL)
                    RtoL.push(point->right);
            }
            if(!tmp.empty())
            {
                res.push_back(tmp);
                tmp.clear();
            }
            while(!RtoL.empty())
            {
                point=RtoL.top();
                RtoL.pop();
                tmp.push_back(point->val);
                
                if(point->right!=NULL)
                    LtoR.push(point->right);
                if(point->left!=NULL)
                    LtoR.push(point->left);
            }
            if(!tmp.empty())
            {
                res.push_back(tmp);
                tmp.clear();
            }
        }
        return res;
    }
    
};