一棵圣诞树记作根节点为 root 的二叉树,节点值为该位置装饰彩灯的颜色编号。请按照如下规则记录彩灯装饰结果:
第一层按照从左到右的顺序记录
除第一层外每一层的记录顺序均与上一层相反。即第一层为从左到右,第二层为从右到左。
示例 1:

**输入:**root = [8,17,21,18,null,null,6]
输出:[[8],[21,17],[18,6]]
提示:
节点总数 <= 1000
同层序遍历,每层要输出的元素是提前能知道的,所以我们可以根据标志位直接找到当前元素应该放在哪个位置
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
| class Solution { public: vector<vector<int>> decorateRecord(TreeNode *root) { vector<vector<int>> ans; queue<TreeNode *> que; if (root != nullptr) que.push(root); bool flag = true; while (!que.empty()) { int len = que.size(); vector<int> mid(len); for (int i = len; i > 0; i--) { TreeNode *cur = que.front(); if (cur->left != nullptr) que.push(cur->left); if (cur->right != nullptr) que.push(cur->right); que.pop(); if (flag) mid[len - i] = cur->val; else if (!flag) mid[i - 1] = cur->val; } flag = !flag; ans.push_back(mid); } return ans; } };
|
也可以使用两个双端队列交替存储,用两个是因为每次入队元素会影响出队元素的遍历
写完后发现只用到了push/ppo front,所以用两个栈存储也可以
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
| class Solution { public: vector<vector<int>> decorateRecord(TreeNode *root) { vector<vector<int>> ans; deque<TreeNode *> que, rque; if (root != nullptr) que.push_front(root); bool flag = true; while (!que.empty() || !rque.empty()) { vector<int> mid; int i = que.empty() ? rque.size() : que.size(); for (i; i > 0; i--) { if (flag) { TreeNode *cur = que.front(); if (cur->left != nullptr) rque.push_front(cur->left); if (cur->right != nullptr) rque.push_front(cur->right); que.pop_front(); mid.push_back(cur->val); } else if (!flag) { TreeNode *cur = rque.front(); if (cur->right != nullptr) que.push_front(cur->right); if (cur->left != nullptr) que.push_front(cur->left); rque.pop_front(); mid.push_back(cur->val); } } flag = !flag; ans.push_back(mid); } return ans; } };
|