请实现一个函数按照之字形顺序从上向下打印二叉树。
即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
数据范围
树中节点的数量 [0,1000]
。
样例
1 2 3 4 5 6 7
| 输入如下图所示二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null] 8 / \ 12 2 / \ 6 4 输出:[[8], [2, 12], [6, 4]]
|
算法思路1、2
在之前的题的基础上,添加了条件判断
详情参考分行从上往下打印二叉树
代码实现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 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); bool flag = false; 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); } if(flag){ reverse(level.begin(), level.end()); } flag = !flag; ans.push_back(level); } return ans; } };
|
代码实现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 53 54 55 56 57 58 59 60 61
|
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; bool flag = false; while(q.size()){ TreeNode * t = q.front(); q.pop(); if(!t){ if(level.empty()) break; if(flag){ reverse(level.begin(), level.end()); } ans.push_back(level); q.push(NULL); level.clear(); flag = !flag; continue; } level.push_back(t -> val); if(t -> left) q.push(t -> left); if(t -> right) q.push(t -> right); } return ans; } };
|
时间复杂度
由于树中每个节点仅会进队出队一次,所以时间复杂度是O(n)