题目描述
给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为
D
,则会创建出D
个链表)。返回一个包含所有深度的链表的数组。
示例
输入:[1,2,3,4,5,null,7,8]
1
/ \
2 3
/ \ \
4 5 7
/
8输出:[[1],[2,3],[4,5,7],[8]]
做题思路
按照题目要求,我们需要将二叉树进行层序遍历,并将每层节点创建成一个链表,最后将所有链表作为数组返回,可以用队列对二叉树进行层序遍历,具体详见代码。
代码
/**
* 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 tree) {
if(tree==null){
return new ListNode[0];
}
Queue<TreeNode> queue=new LinkedList<>(); //存放每一层的节点
queue.add(tree); //将根节点添加进去
List<ListNode> list=new ArrayList<>(); //定义存放链表的列表list
ListNode head=new ListNode(-1); //定义伪头节点,方便后续将当前层链表添加到list中
while(!queue.isEmpty()){
ListNode cur=head; //复制伪头节点,不直接用head操作,方便后续直接获取当前层的链表
int size=queue.size(); //获取队列中元素的个数
for(int i=0;i<size;i++){
tree=queue.poll(); //将节点出队
cur.next=new ListNode(tree.val); //将节点对应的值追加到链表上
cur=cur.next; //指针右移
if(tree.left!=null){
queue.offer(tree.left); //当前节点的左子节点入队
}
if(tree.right!=null){
queue.offer(tree.right); //当前节点的右子节点入队
}
}
list.add(head.next); //将当前层的链表添加到list中
}
return list.toArray(new ListNode[list.size()]); //将列表转化为数组
}
}