Populating Next Right Pointers in Each Node

Sanjeev SharmaSanjeev Sharma
2 min read

Advertisement

Problem

Populate each node's next pointer to point to its next right node. If no right node, set to NULL.

Key insight (perfect binary tree): Use already-set next pointers on current level to set next level. O(1) space.

Approach — O(1) Space using established next pointers

leftmost = root
while leftmost.left:
    cur = leftmost
    while cur:
        cur.left.next = cur.right
        if cur.next: cur.right.next = cur.next.left
        cur = cur.next
    leftmost = leftmost.left

Solutions

// C (O(1) space, perfect BT)
Node* connect(Node* root) {
    if (!root) return NULL;
    Node* leftmost = root;
    while (leftmost->left) {
        Node* cur = leftmost;
        while (cur) {
            cur->left->next = cur->right;
            if (cur->next) cur->right->next = cur->next->left;
            cur = cur->next;
        }
        leftmost = leftmost->left;
    }
    return root;
}
// C++
Node* connect(Node* root) {
    if (!root) return nullptr;
    auto leftmost = root;
    while (leftmost->left) {
        auto cur = leftmost;
        while (cur) {
            cur->left->next = cur->right;
            if (cur->next) cur->right->next = cur->next->left;
            cur = cur->next;
        }
        leftmost = leftmost->left;
    }
    return root;
}
// Java
public Node connect(Node root) {
    if (root == null) return null;
    Node leftmost = root;
    while (leftmost.left != null) {
        Node cur = leftmost;
        while (cur != null) {
            cur.left.next = cur.right;
            if (cur.next != null) cur.right.next = cur.next.left;
            cur = cur.next;
        }
        leftmost = leftmost.left;
    }
    return root;
}
// JavaScript
function connect(root) {
    if (!root) return null;
    let leftmost = root;
    while (leftmost.left) {
        let cur = leftmost;
        while (cur) {
            cur.left.next = cur.right;
            if (cur.next) cur.right.next = cur.next.left;
            cur = cur.next;
        }
        leftmost = leftmost.left;
    }
    return root;
}
# Python
def connect(root):
    if not root:
        return None
    leftmost = root
    while leftmost.left:
        cur = leftmost
        while cur:
            cur.left.next = cur.right
            if cur.next:
                cur.right.next = cur.next.left
            cur = cur.next
        leftmost = leftmost.left
    return root

Complexity

  • Time: O(n)
  • Space: O(1) — leverages already-connected next pointers

Key Insight

Once level L is connected, traverse it using next pointers to connect level L+1.

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro