116. 填充每个节点的下一个右侧节点指针

image.png

层序遍历

执行用时:3 ms, 在所有 Java 提交中击败了45.53% 的用户 内存消耗:38.9 MB, 在所有 Java 提交中击败了12.79% 的用户

  1. class Solution {
  2. public Node connect(Node root) {
  3. if (root == null) return null;
  4. Queue<Node> queue = new LinkedList<>();
  5. queue.add(root);
  6. while (!queue.isEmpty()) {
  7. for (int i = queue.size(); i > 0; i--) {
  8. Node poll = queue.poll();
  9. // 如果节点不是当前层的最后一个节点,将next指向下一个节点
  10. if (i > 1) {
  11. poll.next = queue.peek();
  12. }
  13. if (poll.left != null) queue.add(poll.left);
  14. if (poll.right != null) queue.add(poll.right);
  15. }
  16. }
  17. return root;
  18. }
  19. }

递归解法

执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户 内存消耗:38.8 MB, 在所有 Java 提交中击败了23.83% 的用户

  1. class Solution {
  2. public Node connect(Node root) {
  3. if (root == null) return null;
  4. if (root.left != null) {
  5. // left的next比较简单,直接指向root.right
  6. root.left.next = root.right;
  7. connect(root.left);
  8. }
  9. if (root.right != null) {
  10. // right的next指向root.next.left
  11. root.right.next = root.next == null ? null : root.next.left;
  12. connect(root.right);
  13. }
  14. return root;
  15. }
  16. }