力扣.特定深度节点链表(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;
    }
}
相关推荐
骑士雄师2 分钟前
Java 泛型中级面试题及答案
java·开发语言·面试
.格子衫.6 小时前
Spring Boot 原理篇
java·spring boot·后端
多云几多6 小时前
Yudao单体项目 springboot Admin安全验证开启
java·spring boot·spring·springbootadmin
Swift社区7 小时前
LeetCode 394. 字符串解码(Decode String)
算法·leetcode·职场和发展
tt5555555555558 小时前
LeetCode进阶算法题解详解
算法·leetcode·职场和发展
Jabes.yang8 小时前
Java求职面试实战:从Spring Boot到微服务架构的技术探讨
java·数据库·spring boot·微服务·面试·消息队列·互联网大厂
聪明的笨猪猪8 小时前
Java Redis “高可用 — 主从复制”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
Q741_1478 小时前
C++ 模拟题 力扣495. 提莫攻击 题解 每日一题
c++·算法·leetcode·模拟
兮动人8 小时前
Spring Bean耗时分析工具
java·后端·spring·bean耗时分析工具
MESSIR229 小时前
Spring IOC(控制反转)中常用注解
java·spring