Leetcode 面试题 特定深度节点链表
- 给定一个二叉树,要求返回一个
ListNode[]
ListNode[]
中每个节点i
代表二叉树中第i
层从左到右所有节点构成的链表
思路: BFS
- 遍历过程中对每层节点创建一个
ListNode
链表,并将头节点放入返回参数ListNode[]
中
执行结果: 通过
执行用时:1 ms , 在所有 Java 提交中击败了 99.13% 的用户
内存消耗:38.2 MB , 在所有 Java 提交中击败了 100.00% 的用户
/*广度优先遍历*/
class Solution {
public ListNode[] listOfDepth(TreeNode tree) {
//返回参数
List<ListNode> ansList = new ArrayList<>();
//边界情况
if(tree==null)
return new ListNode[]{};
//bfs队列(提前加入根节点)
List<TreeNode> bfs = new LinkedList<>();
bfs.add(tree);
//记录每层节点数目(当前层oldNum,下一层newNum)
int oldNum = 1, newNum = 0;
//添加该层链表头节点(虚拟头节点,方便后续操作)
ListNode head = new ListNode(-1);
ansList.add(head);
while(!bfs.isEmpty()) {
TreeNode node = bfs.get(0);
bfs.remove(0);
oldNum--;
//更新链表
head.next = new ListNode(node.val);
head = head.next;
//下层节点入队
if(node.left!=null) {
bfs.add(node.left);
newNum++;
}
if(node.right!=null) {
bfs.add(node.right);
newNum++;
}
//遍历层交替
if(oldNum==0) {
oldNum = newNum;
newNum = 0;
if(oldNum!=0) {
head = new ListNode(-1);
ansList.add(head);
}
}
}
//List转数组,同时将每层链表虚拟头节点去除
ListNode[] ans = new ListNode[ansList.size()];
for(int i=0; i<ansList.size(); i++)
ans[i] = ansList.get(i).next;
return ans;
}
}