按之字形顺序打印二叉树

题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
之字形:
思路:
之字形:就是一层是从左向右,一层是从右向左。最初的想法是用一个计数点i,用i的奇偶来判断从右还是从左。
后来发现下一层开始遍历的点就是上一层最后放入的点,所以我们选择栈。由于来回变换所以我们要选择两个栈。就不用i来判断了。
vector的压入,弹出函数为:push_back()   pop_back();(返回值为void)得到最后一个元素back() 得到第一个元素begin(),得到最后一个元素,back()
queue的压入,弹出函数为:push() pop();(返回值为void)队首元素front() 队尾元素back() 队列中元素个数size()
stack的压入,弹出函数为:push()  pop() (返回值为void) 得到栈顶元素top()  队列元素size()
我的代码:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<int> in;
        vector<vector<int>> out;
        if(pRoot == NULL)
            return out;
        stack<TreeNode*> sta;
        stack<TreeNode*> tmp;
        sta.push(pRoot);
        in.push_back(pRoot->val);
        out.push_back(in);
        in.clear();
        TreeNode* ptmp;
        while(!sta.empty())
        {
            while(!sta.empty())
            {
                ptmp = sta.top();
                sta.pop();//外层先右后左
                if(ptmp->right)
                {
                    tmp.push(ptmp->right);
                    in.push_back(ptmp->right->val);
                }
                if(ptmp->left)
                {
                    tmp.push(ptmp->left);
                    in.push_back(ptmp->left->val);
                }
            }
            if(in.size())
            {
                out.push_back(in);
                in.clear();
            }
            while(!tmp.empty())
            {
                ptmp = tmp.top();
                tmp.pop();
                if(ptmp->left)
                {
                    sta.push(ptmp->left);
                    in.push_back(ptmp->left->val);
                }
                if(ptmp->right)
                {
                     sta.push(ptmp->right);
                     in.push_back(ptmp->right->val);
                }
            }
            if(in.size())
            {
                out.push_back(in);
                in.clear();
            }
        }
        return out;
    }

 

posted @ 2018-07-11 10:31  Lune-Qiu  阅读(168)  评论(0编辑  收藏  举报