从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。
数据范围
树中节点的数量 [0,1000]
。
样例
1 2 3 4 5 6 7 8 9 10
| 输入如下图所示二叉树[8, 12, 2, null, null, 6, null, 4, null, null, null] 8 / \ 12 2 / 6 / 4
输出:[[8], [12, 2], [6], [4]]
|
算法思想1
已知不分行的做法是使用BFS
层序遍历这棵树。
在此基础上,做出一些改变,即可得到不分行的做法。
问:在BFS的过程中,能否知道当前队列中有多少节点?
答:可以。队列的容量就是当前层的节点数量
那么,在第1层,只有根节点,队列容量是1,当前层节点数量是1。
在第2层,有2个节点,队列容量是2,当前层节点数量是2。
原BFS
每次只能弹出一个节点,如果我们一次性弹出当前层数
的节点呢?然后将它放入小集合。
这样一轮结束,将小集合放入大集合。
代码实现1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
class Solution { public: vector<vector<int>> printFromTopToBottom(TreeNode* root) { vector<vector<int>> ans; if(!root) return ans; queue<TreeNode *> q; q.push(root); while(q.size()){ int len = q.size(); vector<int> level; while(len --){ TreeNode * t = q.front(); q.pop(); level.push_back(t -> val); if(t -> left) q.push(t -> left); if(t -> right) q.push(t -> right); } ans.push_back(level); } return ans; } };
|
算法思想2
代码实现2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
class Solution { public: vector<vector<int>> printFromTopToBottom(TreeNode* root) { vector<vector<int>> ans; if(!root) return ans; queue<TreeNode *> q; q.push(root); q.push(NULL); vector<int> level; while(q.size()){ TreeNode * t = q.front(); q.pop(); if(!t){ if(level.empty()) break; ans.push_back(level); q.push(NULL); level.clear(); continue; } level.push_back(t -> val); if(t -> left) q.push(t -> left); if(t -> right) q.push(t -> right); } return ans; } };
|
时间复杂度
由于树中每个节点仅会进队出队一次,所以时间复杂度是O(n)