JZ60 把二叉树打印成多行
题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路
这题本质上是树的广度优先遍历,用一个队列就可以实现:
(1) 先把头结点放入队列;
(2) 取一个数就把它的左右节点放进队列
(3) 直到队列为空
但是这里我遇到了一个问题,需要分行输出怎么办?
我一开始是想着,队列中途会为空,为空了就代表一行结束了,这个时候就把临时数组放进res中并清空,但是这个只是对于第一行来说;从第二行开始,取一个数就把它的左右孩子放进队列,这个时候已经到下一行了,队列也不为空。
然后看到讨论区中的一种方法:用队列里的当前个数来控制每一行的结束,每次放完后就先把size保存起来,取一个数就减一,直到减为0了就换行
代码
class Solution { public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int>> res; if(pRoot==NULL) return res; vector<int> res_temp; queue<TreeNode*> help; TreeNode* pNode; help.push(pRoot); int numInEachFloor; while(!help.empty()) { numInEachFloor=help.size(); while(numInEachFloor--) { pNode=help.front(); help.pop(); res_temp.push_back(pNode->val); if(pNode->left!=NULL) help.push(pNode->left); if(pNode->right!=NULL) help.push(pNode->right); } res.push_back(res_temp); res_temp.clear(); } return res; } };