解法一:next指针

117. 填充每个节点的下一个右侧节点指针 II。利用 next 指针在本层中遍历,并填充下一层的 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. // 本层上一个结点
  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. if (firstNode == null) {
  44. firstNode = p;
  45. }
  46. if (lastNode != null) {
  47. lastNode.next = p;
  48. }
  49. lastNode = p;
  50. }
  51. }