面试题 04.03. 特定深度节点链表

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. /**
  11. * Definition for singly-linked list.
  12. * public class ListNode {
  13. * int val;
  14. * ListNode next;
  15. * ListNode(int x) { val = x; }
  16. * }
  17. */
  18. class Solution {
  19. public ListNode[] listOfDepth(TreeNode tree) {
  20. if (tree == null)
  21. return new ListNode[0];
  22. List<ListNode> ans = new LinkedList<>();
  23. Queue<TreeNode> queue = new LinkedList<>();
  24. queue.add(tree);
  25. int currentLevel = 1;
  26. int nextLevel = 0;
  27. ListNode dummy = new ListNode();
  28. dummy.next = null;
  29. ListNode p = dummy;
  30. while (!queue.isEmpty()) {
  31. TreeNode currentNode = queue.remove();
  32. currentLevel--;
  33. // 尾插法:将当前层次的当前节点添加到指针p的后面,p随后后移
  34. ListNode node = new ListNode(currentNode.val);
  35. node.next = p.next;
  36. p.next = node;
  37. p = p.next;
  38. if (currentNode.left != null) {
  39. nextLevel++;
  40. queue.add(currentNode.left);
  41. }
  42. if (currentNode.right != null) {
  43. nextLevel++;
  44. queue.add(currentNode.right);
  45. }
  46. if (currentLevel == 0) {
  47. ans.add(dummy.next);
  48. currentLevel = nextLevel;
  49. nextLevel = 0;
  50. // 构造保存下一层的链表的头节点
  51. dummy = new ListNode();
  52. dummy.next = null;
  53. p = dummy;
  54. }
  55. } // while
  56. return ans.toArray(new ListNode[ans.size()]);
  57. }
  58. }