(剑指Offer)面试题61:按之字形顺序打印二叉树

题目:

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

思路:

按照广度优先遍历来遍历二叉树,但是需要按照之字形来打印,意味着:

奇数行从左到右,跟BFS的遍历顺序一样,而偶数行从右到左,跟BFS的遍历顺序相反。

因此我们不能直接采用队列,可以通过两个栈来实现,一个实现先进先出,即入栈顺序为右子节点、左子节点;一个实现后进先出,即入栈顺序为左子节点、右子节点。(具体参照代码)

在线测试:

http://www.nowcoder.com/books/coding-interviews/91b69814117f4e8097390d107d2efbe0?rp=3

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> > result;
         
        if(pRoot == NULL)
            return result;
         
        stack<TreeNode*> stk1;
        stack<TreeNode*> stk2;
        stk1.push(pRoot);
        TreeNode* tmp;
        vector<int> tLevel;
         
        while(!stk1.empty() || !stk2.empty())
        {
            if(!stk1.empty())
            {
                while(!stk1.empty())
                {
                    tmp=stk1.top();
                    tLevel.push_back(tmp->val);
                    if(tmp->left)
                        stk2.push(tmp->left);
                    if(tmp->right)
                        stk2.push(tmp->right);
                    stk1.pop();
                }
                result.push_back(tLevel);
                tLevel.clear();
            }
            else
            {
                while(!stk2.empty())
                {
                    tmp=stk2.top();
                    tLevel.push_back(tmp->val);
                    if(tmp->right)
                        stk1.push(tmp->right);
                    if(tmp->left)
                        stk1.push(tmp->left);
                    stk2.pop();
                }
                result.push_back(tLevel);
                tLevel.clear();
            }
        }
        return result;
     
    }
     
};
posted @ 2015-08-11 20:45  AndyJee  阅读(2051)  评论(0编辑  收藏  举报