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

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

文章目录

题目描述

思路

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

1.利用BFS 获取二叉树每一层的节点

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

解题方法

1.创建ArrayList集合便于存贮每一层节点组成的链表

2.利用BFS 算法获取二叉树每一层的节点,在该遍历每一层时,先创建虚拟头节点和尾指针(尾指针初始化指向创建的虚拟头节点),利用尾插法 将该层的节点添加到该层的链表中,最后再将虚拟头节的下一个节点添加到ArrayList集合中

3.将ArrayList集合转换为数组并返回

复杂度

时间复杂度:

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

空间复杂度:

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

Code

java 复制代码
/**
 * 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;
    }
}
相关推荐
.道阻且长.8 小时前
2.LeetCode算法习题讲解--双指针--复写零
算法·leetcode·职场和发展
·薯条大王8 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
To_OC9 小时前
LC 438 找到所有字母异位词:暴力超时后,我靠滑动窗口一招搞定
javascript·算法·leetcode
ZJH__GO11 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆11 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光11 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林11 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
marvelyu12 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
AI人工智能+电脑小能手13 小时前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
BUG指挥官14 小时前
Sa-Token和Spring Security对比
java·后端·spring