[LeetCode][LCR151]彩灯装饰记录 III——队列

题目

LCR 151. 彩灯装饰记录 III

一棵圣诞树记作根节点为 root 的二叉树,节点值为该位置装饰彩灯的颜色编号。请按照如下规则记录彩灯装饰结果:

  • 第一层按照从左到右的顺序记录
  • 除第一层外每一层的记录顺序均与上一层相反。即第一层为从左到右,第二层为从右到左。

示例:

复制代码
输入:root = [8,17,21,18,null,null,6] 输出:[[8],[21,17],[18,6]]

提示:

节点总数 <= 1000

解法

  1. 奇数层和偶数层分开考虑,奇数层从左到右记录,偶数层从右到左记录
  2. 比如当前层是奇数层,那么从左到右输出当前节点,而从右到左记录当前节点的右子树和左子树
  3. 如果当前层是偶数层,则从右到左输出当前节点,从左到右记录当前节点的左子树和右子树
  4. 根据彩灯装饰记录 II,可以使用队列进行记录,并且每次都输出队列中同一层的元素而不输出其他层元素(也就是在增加下一层元素之前,先记录下队列中已有的元素个数(也就是当前层的元素个数))
  5. 如果当前层是奇数层,在从左到右输出当前节点的同时,需要从右到左地记录当前节点的子节点,子节点应该放在右边,以免在输出当前节点的时候被输出了
  6. 如果当前层是偶数层,在从右向左输出当前节点的同时,需要从左到右记录当前节点的子节点,子节点应该放在左边,以免在从右向左输出当前节点时被输出了
  7. 按以上的分析,需要使用双端队列来实现
cpp 复制代码
/**
 * 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) {
        vector<vector<int>> ans;
        if(!root) return ans;
        deque<TreeNode*> dq;
        dq.push_back(root);
        int layerNum=0;
        while(!dq.empty()){
            ++layerNum;
            vector<int> v;
            int size=dq.size();
            for(int i=0; i<size; ++i){
                if(layerNum%2){//奇数层从左到右
                    v.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{
                    v.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();
                }
            }   
            ans.push_back(v);     
        }
        return ans;
    }
};
相关推荐
故事和你918 小时前
洛谷-数据结构1-1-线性表1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
脱氧核糖核酸__8 小时前
LeetCode热题100——53.最大子数组和(题解+答案+要点)
数据结构·c++·算法·leetcode
脱氧核糖核酸__8 小时前
LeetCode 热题100——42.接雨水(题目+题解+答案)
数据结构·c++·算法·leetcode
王老师青少年编程9 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:数列分段 Section I
c++·算法·编程·贪心·csp·信奥赛·线性扫描贪心
王老师青少年编程9 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:分糖果
c++·算法·贪心算法·csp·信奥赛·线性扫描贪心·分糖果
_日拱一卒9 小时前
LeetCode:2两数相加
算法·leetcode·职场和发展
py有趣9 小时前
力扣热门100题之零钱兑换
算法·leetcode
董董灿是个攻城狮9 小时前
Opus 4.7 来了,我并不建议你升级
算法
无敌昊哥战神10 小时前
【保姆级题解】力扣17. 电话号码的字母组合 (回溯算法经典入门) | Python/C/C++多语言详解
c语言·c++·python·算法·leetcode
脱氧核糖核酸__10 小时前
LeetCode热题100——238.除了自身以外数组的乘积(题目+题解+答案)
数据结构·c++·算法·leetcode