有了上一个之字形打印二叉树,这个题就比较简单了。
首先分析这道题的结构,一行一行的输出。
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; } };
原文:https://www.cnblogs.com/neverland0718/p/11254397.html