一棵圣诞树记作根节点为 root
的二叉树,节点值为该位置装饰彩灯的颜色编号。请按照如下规则记录彩灯装饰结果:
- 第一层按照从左到右的顺序记录
- 除第一层外每一层的记录顺序均与上一层相反。即第一层为从左到右,第二层为从右到左。
示例 1:
输入:root = [8,17,21,18,null,null,6]
输出:[[8],[21,17],[18,6]]
提示:
节点总数 <= 1000
思路:
1、如果根结点为空,直接返回{}。
2、创建双端队列q并初始化将根结点入队(利用其两端都可以进出的特性来进行正反交替记录),定义正反交替记录标志flag。
3、广度优先循环(队列不为空)
计算当前队列长度size,创建临时数组。
(在循环体外部创建临时数组会导致开始遍历当前层次时临时数组不为空)
根据当前队列长度size大小从前往后遍历当前层次结点。
后进前出
1、队首元素插入临时数组尾部。
2、依次将队首元素不为空的左子树、右子树插入队尾(下一层先左子树后右子树顺序存放至队尾)。
3、队首元素出队。
根据当前队列长度size大小从后往前遍历当前层次结点。
前进后出
1、队尾元素插入临时数组尾部。
2、依次将队首元素不为空的右子树、左子树插入队首(下一层先右子树后左子树逆序存放至队首)。
3、队尾元素出队。
标志位置反,临时数组插入结果数组尾部。 4、返回结果数组。
代码实现:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> decorateRecord(TreeNode* root) {
if(!root)
return {};
bool flag = true;
vector<vector<int>>res;
deque<TreeNode*>dq;
dq.push_back(root);
while(!dq.empty())
{
vector<int>tmp;
int size = dq.size();
if(flag) //后进前出
{
for(int i = 0; i < size; ++i)
{
tmp.push_back(dq.front()->val);
if(dq.front()->left) //顺序存放至队尾
dq.push_back(dq.front()->left);
if(dq.front()->right)
dq.push_back(dq.front()->right);
dq.pop_front();
}
}
else //前进后出
{
for(int i = size; i > 0; --i)
{
tmp.push_back(dq.back()->val);
if(dq.back()->right) //逆序存放至队首
dq.push_front(dq.back()->right);
if(dq.back()->left)
dq.push_front(dq.back()->left);
dq.pop_back();
}
}
flag = !flag;
res.push_back(tmp);
}
return res;
}
};