剑指offer系列49:把二叉树打印成多行

有了上一个之字形打印二叉树,这个题就比较简单了。

首先分析这道题的结构,一行一行的输出。

1.如果第一行顺序存储,也就是先存左边在存右边。那么输出的时候也要同样的先左边后右边的顺序。这就是先进先出,所以用队列。

2.如果不顺序存,使用栈来存。第二行就先右边在左边,必须这样第一行输出的时候才可以先左后右。存第三行是根据第二行的弹出顺序决定的。因为第二行的弹出顺序是从左向右,所以第三行的第一个元素必须是第二行左边元素的子树。也就是在栈底。也就是说第三行开始的元素放在栈底只能最后输出,这样必然是不对的。

class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int> > re;
        if (pRoot == NULL)
            return re;
        deque<TreeNode*> st[2];

        vector<int> aux;

        int cur = 0;
        int next = 1;
        st[cur].push_front(pRoot);
        while (!st[0].empty()|| !st[1].empty())
        {
            TreeNode *pnode = st[cur].front();
            st[cur].pop_front();//从队列前面出
            aux.push_back(pnode->val);
            
            //要求输出:左-》右
            if (pnode->left)
                st[next].push_back(pnode->left);//从队列后面进
            if (pnode->right)
                st[next].push_back(pnode->right);//从队列后面进

            if (st[cur].empty())//一行全部输出
            {
                re.push_back(aux);
                aux.clear();
                cur = 1 - cur;
                next = 1 - next;
            }
        }
        return re;
    }

};

 

posted @ 2019-07-27 11:35  妮妮熊  阅读(106)  评论(0编辑  收藏  举报