解法一:广度优先遍历

层序遍历,给当前层每一个结点安排上 next 。不过这样做没有满足常数级额外空间的要求。

  1. /*
  2. // Definition for a Node.
  3. class Node {
  4. public int val;
  5. public Node left;
  6. public Node right;
  7. public Node next;
  8. public Node() {}
  9. public Node(int _val) {
  10. val = _val;
  11. }
  12. public Node(int _val, Node _left, Node _right, Node _next) {
  13. val = _val;
  14. left = _left;
  15. right = _right;
  16. next = _next;
  17. }
  18. };
  19. */
  20. class Solution {
  21. public Node connect(Node root) {
  22. Queue<Node> nodes = new LinkedList<>();
  23. if (root != null) {
  24. nodes.offer(root);
  25. }
  26. while (!nodes.isEmpty()) {
  27. int size = nodes.size();
  28. Node last = nodes.poll();
  29. if (last.left != null) {
  30. nodes.offer(last.left);
  31. }
  32. if (last.right != null) {
  33. nodes.offer(last.right);
  34. }
  35. for (int i = 0; i < size - 1; ++i) {
  36. Node cur = nodes.poll();
  37. if (cur.left != null) {
  38. nodes.offer(cur.left);
  39. }
  40. if (cur.right != null) {
  41. nodes.offer(cur.right);
  42. }
  43. last.next = cur;
  44. last = cur;
  45. }
  46. last.next = null;
  47. }
  48. return root;
  49. }
  50. }

解法二

参考官方题解:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/solution/tian-chong-mei-ge-jie-dian-de-xia-yi-ge-you-ce-15/

  1. /*
  2. // Definition for a Node.
  3. class Node {
  4. public int val;
  5. public Node left;
  6. public Node right;
  7. public Node next;
  8. public Node() {}
  9. public Node(int _val) {
  10. val = _val;
  11. }
  12. public Node(int _val, Node _left, Node _right, Node _next) {
  13. val = _val;
  14. left = _left;
  15. right = _right;
  16. next = _next;
  17. }
  18. };
  19. */
  20. class Solution {
  21. // 上一个结点
  22. private Node lastNode;
  23. // 下一层第一个结点
  24. private Node firstNode;
  25. public Node connect(Node root) {
  26. Node begin = root;
  27. while (begin != null) {
  28. lastNode = null;
  29. firstNode = null;
  30. for (Node i = begin; i != null; i = i.next) {
  31. if (i.left != null) {
  32. handle(i.left);
  33. }
  34. if (i.right != null) {
  35. handle(i.right);
  36. }
  37. }
  38. begin = firstNode;
  39. }
  40. return root;
  41. }
  42. private void handle(Node p) {
  43. // 不是下一层第一个结点
  44. if (lastNode != null) {
  45. lastNode.next = p;
  46. }
  47. // 记录下一层第一个结点
  48. if (firstNode == null) {
  49. firstNode = p;
  50. }
  51. lastNode = p;
  52. }
  53. }