最好先看一下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);}}
