给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。
示例:
思路:使用BFS对二叉树进行层次遍历,每层都使用一个链表来存储。ListNode[ ]中的元素存放着每一层的第一个节点。
代码实现:
/**
* 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 {
public ListNode[] listOfDepth(TreeNode root) {
if (root == null) {
return null;
}
//BFS中的队列
Queue<TreeNode> queue = new LinkedList<>();
//先把根节点入队,然后执行“弹一个,加n个”
queue.add(root);
//存放每个链表第一个有实际值(非哑元)节点的容器,ArrayList实际上是一个可变长的数组
List<ListNode> list = new ArrayList<>();
//只要队列中还有元素就要不停的出队,直到队列中的所有元素都已出队
while (!queue.isEmpty()) {
//当前队列的长度,即当前层元素的总个数
int size = queue.size();
//链表的头结点,不放实际的值(哑元)
ListNode head = new ListNode(0);
//链表移动指针,让它始终指向当表链表的最后一个元素
ListNode p = head;
//将当前层的节点逐个出队,把出队节点的子节点入队
for (int i = 0; i < size; i++) {
TreeNode poll = queue.poll();
//链表元素追加
p.next = new ListNode(poll.val);
//指针向后移动一个元素,使p指向链表末尾
p = p.next;
if (poll.left != null) {
//当前出队的节点有左孩子,则左孩子入队
queue.add(poll.left);
}
if (poll.right != null) {
//当前出队的节点有右孩子,则右孩子入队
queue.add(poll.right);
}
}
//for循环走完后就遍历完了一层,将存储该层节点的链表第一个有实际值的节点入队
list.add(head.next);
}
//将可变长的数组转化成定长数组(因为函数的返回值要求了返回一个定长数组ListNode[])
return list.toArray(new ListNode[list.size()]);
}
}