Binary Tree Level Order Traversal II 问题解答

今天继续解答leetcode上的一个问题,关于二叉树遍历的。
题目
Given a binary tree, return the bottom-up level order traversal of its nodes’ values. (ie, from left to right, level by level from leaf to root).

For example:
Given binary tree {3,9,20,#,#,15,7},
3
/ \
9 20
/ \
15 7
return its bottom-up level order traversal as:
[
[15,7],
[9,20],
[3]
]

根据例子及题意分析,该题要求对于一个二叉树进行层序遍历,并将每一层的内容放到一个LIST中,最终把各层的LIST放到一个总的LIST里,并且是倒序放置。

分析
本题的考察点在于二叉树的层序遍历,一般的层序遍历的思路是,借用一个辅助的队列,主要思路如下:

  1. 将树的根节点放在队列里
  2. 如果队列不为空,则进入步骤3,否则进行步骤5
  3. 取出队头元素并打印,同时,将队头元素的左右子节点(如果有的话)再放入队尾
  4. 转到步骤2
  5. 结束

但以上逻辑有一个问题是虽然可以分层打印,但无法判断每一层的结束。所以在这里需要稍做改动,个人的想法是,不使用队列,而是使用一个节点LIST,以及一个值列表。思路如下:

  1. 将树的根节点放在节点列表里
  2. 如果节点列表不为空,则对其遍历,进入步骤3,否则到7
  3. 定义一个临时的节点列表L,并初始化值列表
  4. 遍历原节点列表,将每一个节点的值取出,放入值列表中。并将元素的左右子节点(如果有的话)再放入临时节点列表L里
  5. 将值列表存储到最终的结果列表里,将原节点列表指向临时节点列表
  6. 转到2
  7. 结束

以下是相关代码:

    /**
     * 本算法的大体思路如下:
     * 1. 处理ROOT,并将ROOT的左右节点放到一个列表中去
     * 2. ROOT处理完后,若列表不为空,则再循环处理那个列表,对于列表中的每个元素,将其子元素放到列表中去
     * 3. 依次循环,直到列表为空
     * @param root 树的头节点
     * @return 最终结果
     */
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        if(root == null){
            return Collections.emptyList();
        }

        List<List<Integer>> resultList = new ArrayList<List<Integer>>();

        List<TreeNode> levelList = new ArrayList<TreeNode>();
        List<Integer> valueList = null;

        //初始化,把ROOT加进去
        levelList.add(root);

        while(!levelList.isEmpty()){

            valueList = new ArrayList<Integer>();

            List<TreeNode> nodeList = new ArrayList<TreeNode>();

            // 每次循环实际上就是处理了一层
            for(TreeNode treeNode : levelList){

                valueList.add(treeNode.val);

                // 为下一次循环做准备
                if(treeNode.left != null){
                    nodeList.add(treeNode.left);
                }

                if(treeNode.right != null){
                    nodeList.add(treeNode.right);
                }

            }

            // 处理完本层后,需要将结果进行存储,由于是倒序,所以需要加在头节点。
            resultList.add(0, valueList);

            levelList = nodeList;
        }
        return resultList;
    }

代码通过leetcode的单元测试,性能上来看属于中间水平,本文中的并不一定是最优解,期待有更好的解法。

基于Swin Transformer与ASPP模块的图像分类系统设计与实现 本文介绍了一种结合Swin Transformer与空洞空间金字塔池化(ASPP)模块的高效图像分类系统。该系统通过融合Transformer的全局建模能力和ASPP的多尺度特征提取优势,显著提升了模型在复杂场景下的分类性能。 模型架构创新 系统核心采用Swin Transformer作为骨干网络,其层次化窗口注意力机制能高效捕获长距离依赖关系。在特征提取阶段,创新性地引入ASPP模块,通过并行空洞卷积(膨胀率6/12/18)和全局平均池化分支,实现多尺度上下文信息融合。ASPP输出经1x1卷积降维后与原始特征拼接,有效增强了模型对物体尺寸变化的鲁棒性。 训练优化策略 训练流程采用Adam优化器(学习率0.0001)和交叉熵损失函数,支持多GPU并行训练。系统实现了完整的评估指标体系,包括准确率、精确率、召回率、特异度和F1分数等6项指标,并通过动态曲线可视化模块实时监控训练过程。采用早停机制保存最佳模型,验证集准确率提升可达3.2%。 工程实现亮点 1. 模块化设计:分离数据加载、模型构建和训练流程,支持快速迭代 2. 自动化评估:每轮训练自动生成指标报告和可视化曲线 3. 设备自适应:智能检测CUDA可用性,无缝切换训练设备 4. 中文支持:优化可视化界面的中文显示与负号渲染 实验表明,该系统在224×224分辨率图像分类任务中,仅需2个epoch即可达到92%以上的验证准确率。ASPP模块的引入使小目标识别准确率提升15%,特别适用于医疗影像等需要细粒度分类的场景。未来可通过轻量化改造进一步优化推理速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值