力扣.特定深度节点链表(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;
    }
}
相关推荐
程序员-珍6 分钟前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
2401_8572979132 分钟前
招联金融2025校招内推
java·前端·算法·金融·求职招聘
福大大架构师每日一题43 分钟前
23.1 k8s监控中标签relabel的应用和原理
java·容器·kubernetes
金灰1 小时前
HTML5--裸体回顾
java·开发语言·前端·javascript·html·html5
菜鸟一皓1 小时前
IDEA的lombok插件不生效了?!!
java·ide·intellij-idea
爱上语文1 小时前
Java LeetCode每日一题
java·开发语言·leetcode
bug菌1 小时前
Java GUI编程进阶:多线程与并发处理的实战指南
java·后端·java ee
程序猿小D2 小时前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
极客先躯2 小时前
高级java每日一道面试题-2024年10月3日-分布式篇-分布式系统中的容错策略都有哪些?
java·分布式·版本控制·共识算法·超时重试·心跳检测·容错策略
夜月行者3 小时前
如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue
java·后端·ssm