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

文章描述了一种解决二叉树装饰记录问题的方法,通过将奇数层和偶数层的节点访问顺序反转,利用队列(包括双端队列)进行层次遍历,记录彩灯装饰结果。
摘要由CSDN通过智能技术生成

题目

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. 按以上的分析,需要使用双端队列来实现
/**
 * 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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__Witheart__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值