最好先看一下LeetCode关于树的串行化格式和实际结构的说明。第一遍写理解得出了些偏差,吃了点亏。
解法一:广度优先遍历
第一遍写的。用了各种标志来记录以保证正确维护遍历深度。
/**
* 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) {
// BFS队列
Queue<TreeNode> queue = new LinkedList<>();
// 答案
List<ListNode> list = new LinkedList<>();
queue.offer(tree);
// 当前遍历深度
int depth = 0;
// 当前层最后一个结点
TreeNode lastTreeNode = tree;
// 下一层最后一个孩子结点
TreeNode tail = tree;
// 当前层已加入答案的最后一个结点
ListNode lastListNode = null;
while (!queue.isEmpty()) {
TreeNode tmp = queue.poll();
// 该层的第一个结点
if (list.size() == depth) {
lastListNode = new ListNode(tmp.val);
list.add(lastListNode);
} else {
ListNode newNode = new ListNode(tmp.val);
lastListNode.next = newNode;
lastListNode = newNode;
}
if (tmp.left != null) {
queue.offer(tmp.left);
tail = tmp.left;
}
if (tmp.right != null) {
queue.offer(tmp.right);
tail = tmp.right;
}
// 当前层已经全部遍历完,进入下一层
if (tmp == lastTreeNode) {
++depth;
lastTreeNode = tail;
}
}
ListNode[] ans = new ListNode[depth];
return list.toArray(ans);
}
}
解法二:简化解法一
提交完解法一看了下其他人的解法,发现之前自己写复杂了,只需要先记录该层的结点数,然后通过循环全部遍历完就可以直接进入下一层。
/**
* 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) {
// BFS队列
Queue<TreeNode> queue = new LinkedList<>();
// 答案
List<ListNode> list = new LinkedList<>();
queue.offer(tree);
// 当前遍历深度
int depth = 0;
// 当前层已加入答案的最后一个结点
ListNode lastListNode = null;
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; ++i) {
TreeNode tmp = queue.poll();
// 该层的第一个结点
if (i == 0) {
lastListNode = new ListNode(tmp.val);
list.add(lastListNode);
} else {
ListNode newNode = new ListNode(tmp.val);
lastListNode.next = newNode;
lastListNode = newNode;
}
if (tmp.left != null) {
queue.offer(tmp.left);
}
if (tmp.right != null) {
queue.offer(tmp.right);
}
}
++depth;
}
ListNode[] ans = new ListNode[depth];
return list.toArray(ans);
}
}