当前位置: 首页 > article >正文

力扣.特定深度节点链表(java BFS解法)

Problem: 面试题 04.03. 特定深度节点链表

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

在这里插入图片描述

思路

根据题意需要取出二叉树每一层节点组成的链表并将其添加到一个数组中。我们将该要求分解成如下的操作:

1.利用BFS获取二叉树每一层的节点
2.利用链表的尾插法将二叉树每一层的节点添加到该层节点组成的链表中(采用虚拟头节点和尾指针

解题方法

1.创建ArrayList集合便于存贮每一层节点组成的链表
2.利用BFS算法获取二叉树每一层的节点,在该遍历每一层时,先创建虚拟头节点和尾指针(尾指针初始化指向创建的虚拟头节点),利用尾插法将该层的节点添加到该层的链表中,最后再将虚拟头节的下一个节点添加到ArrayList集合中
3.将ArrayList集合转换为数组并返回

复杂度

时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( n ) O(n) O(n)

Code

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
   /**
     * Gets a list of nodes at each level of a tree
     *
     * @param tree the root node of a tree
     * @return ListNode[]
     */
    public ListNode[] listOfDepth(TreeNode tree) {
        if (tree == null) {
            return new ListNode[0];
        }
        List<ListNode> result = new ArrayList<ListNode>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        //Add the root node to queue
        queue.add(tree);
        //BFS
        while (!queue.isEmpty()) {
            //Create a dummy node and a tail pointer
            ListNode dummyHead = new ListNode(Integer.MAX_VALUE);
            ListNode tail = dummyHead;
            int curLevelNum = queue.size();
            for (int i = 0; i < curLevelNum; ++i) {
                TreeNode curLevelNode = queue.poll();
                //Adds the nodes of the current layer
                //to the resulting linked list
                tail.next = new ListNode(curLevelNode.val);
                tail = tail.next;
                if (curLevelNode.left != null) {
                    queue.add(curLevelNode.left);
                }
                if (curLevelNode.right != null) {
                    queue.add(curLevelNode.right);
                }
            }
            //Add the LinkedList of the current level
            //to the resulting list
            result.add(dummyHead.next);
        }
        ListNode[] finalResult = new ListNode[result.size()];
        //Convert List to an array of int
        for (int i = 0; i < result.size(); ++i) {
            finalResult[i] = result.get(i);
        }
        return finalResult;
    }
}

http://www.kler.cn/a/154757.html

相关文章:

  • 【从零开始的LeetCode-算法】3239. 最少翻转次数使二进制矩阵回文 I
  • Spring Boot框架:构建可扩展的网上商城
  • JVM双亲委派与自定义类加载器
  • 聊天服务器(9)一对一聊天功能
  • 【鸿蒙开发】第十一章 Stage模型应用组件-任务Mission
  • 论文精读(笔记)
  • 深入了解Java8新特性-日期时间API:LocalDateTime类
  • 关于Typora如何插入自己的云端视频的方法
  • SQL Sever 复习笔记【一】
  • 达梦8搭建DataWatch集群
  • [iOS]常用修饰符详解
  • 每日一练:阿姆斯特朗数
  • java Lock锁的使用
  • 【Element-ui】Checkbox 多选框 与 Input 输入框
  • 责任链设计模式
  • 机器学习笔记 - 异常检测之OneClass SVM算法简述
  • etlbox.3.1.0 for NET 轻量级 ETL数据集成库 Crack
  • 熬夜会秃头——beta冲刺Day3
  • scrapyd及gerapy的使用及docker-compse部署
  • UI上传组件异步上传更改为同步
  • arXiv学术速递笔记11.28
  • JVM运行时数据区域
  • 【2023CANN训练营第二季】——Ascend C自定义算子工程介绍及实验
  • Three.js的THREE.LOD如何加载gltf模型
  • 华为鲲鹏+银河麒麟V10编译FreeSWITCH1.10.9
  • 配置typroa上传图片到gitee