medium Connect Level Order Siblings
Problem Statement
Given a root of the binary tree, connect each node with its level order successor. The last node of each level should point to a null node.
Examples
Example 1:
- Input: root = [1, 2, 3, 4, 5, 6, 7]
- Output:
[1 -> null] [2 -> 3 -> null] [4 -> 5 -> 6 -> 7 -> null] - Explanation:
The tree is traversed level by level using BFS. Each node is connected to its next right node at the same level. The last node of each level points tonull.
Example 2:
- Input: root = [12, 7, 1, 9, null, 10, 5]
- Output:
[12 -> null] [7 -> 1 -> null] [9 -> 10 -> 5 -> null] - Explanation:
The nodes are connected to their next right sibling at the same level. The last node of each level points tonull.
Constraints:
- The number of nodes in the tree is in the range [0, 212 - 1].
-1000 <= Node.val <= 1000
Try it yourself
Try solving this question here:
✅ Solution Connect Level Order Siblings
Problem Statement
Given a root of the binary tree, connect each node with its level order successor. The last node of each level should point to a null node.
Examples
Example 1:
- Input: root = [1, 2, 3, 4, 5, 6, 7]
- Output:
[1 -> null] [2 -> 3 -> null] [4 -> 5 -> 6 -> 7 -> null] - Explanation:
The tree is traversed level by level using BFS. Each node is connected to its next right node at the same level. The last node of each level points tonull.
Example 2:
- Input: root = [12, 7, 1, 9, null, 10, 5]
- Output:
[12 -> null] [7 -> 1 -> null] [9 -> 10 -> 5 -> null] - Explanation:
The nodes are connected to their next right sibling at the same level. The last node of each level points tonull.
Constraints:
- The number of nodes in the tree is in the range [0, 212 - 1].
-1000 <= Node.val <= 1000
Solution
To solve this problem, we perform a level order traversal using Breadth-First Search (BFS) while connecting each node to its immediate right neighbor within the same level. We use a queue to keep track of nodes at each level and maintain a previousNode pointer to establish connections. At the start of each level, previousNode is set to null. As we process nodes within the level, we link previousNode.next to the currentNode, ensuring all siblings are connected. The previousNode is then updated to the currentNode for subsequent connections. Once a node is processed, its left and right children are enqueued so they are available in the next level. The last node of each level remains pointing to null, marking the end of the level's linked sequence.
This approach ensures that all nodes within the same level are properly connected while preserving the correct order of traversal. Once all levels are processed, the modified tree is returned.
Step-by-Step Algorithm
-
Handle the Base Case:
- If the root is
null, returnnullimmediately.
- If the root is
-
Initialize BFS:
- Create a queue and enqueue the
rootnode.
- Create a queue and enqueue the
-
Process Each Level Iteratively:
- While the queue is not empty:
- Determine
levelSize, the number of nodes in the current level. - Initialize
previousNodeasnullto keep track of the last processed node.
- Determine
- While the queue is not empty:
-
Connect Nodes in the Current Level:
- Iterate over all nodes in the current level:
- Dequeue the front node.
- If
previousNodeis notnull, setpreviousNode.next = currentNodeto connect them. - Update
previousNodetocurrentNodeto store previously processed node for the next level. - Enqueue the left and right children (if they exist).
- Iterate over all nodes in the current level:
-
Move to the Next Level and Repeat Until the Queue is Empty.
-
Return the Modified Tree Root.
Algorithm Walkthrough
-
Initialize BFS Traversal:
- Start with the root node
12. - Initialize an empty queue and enqueue
12.
Queue:
[12] - Start with the root node
-
Process Level 1 (Root Level):
- Level Size:
1(only node12in this level). - Initialize
previousNode = null. - Dequeue
12:- Since
previousNodeisnull, assignpreviousNode = 12. - Enqueue left child
7. - Enqueue right child
1.
- Since
Queue after processing:
[7, 1]
Next Pointer Connection:12 -> null(last node in level points tonull) - Level Size:
-
Process Level 2:
- Level Size:
2(nodes7and1). - Initialize
previousNode = null. - Dequeue
7:- Since
previousNodeisnull, assignpreviousNode = 7. - Enqueue left child
9(no right child for7).
- Since
- Dequeue
1:- Connect
7.next = 1(link the previous node to the current node). - Update
previousNode = 1. - Enqueue left child
10. - Enqueue right child
5.
- Connect
Queue after processing:
[9, 10, 5]
Next Pointer Connections:7 -> 1 -> null - Level Size:
-
Process Level 3:
- Level Size:
3(nodes9, 10, 5). - Initialize
previousNode = null. - Dequeue
9:- Since
previousNodeisnull, assignpreviousNode = 9. 9has no children, so nothing is enqueued.
- Since
- Dequeue
10:- Connect
9.next = 10(link the previous node to the current node). - Update
previousNode = 10. 10has no children, so nothing is enqueued.
- Connect
- Dequeue
5:- Connect
10.next = 5(link the previous node to the current node). - Update
previousNode = 5. 5has no children, so nothing is enqueued.
- Connect
Queue after processing:
[](No more nodes to process).
Next Pointer Connections:9 -> 10 -> 5 -> null - Level Size:
Final Connected Tree
12 -> null
/ \
7 -> 1 -> null
/ / \
9 -> 10 -> 5 -> null
Code
Here is the code for this algorithm:
import java.util.*;
// class TreeNode {
// int val;
// TreeNode left;
// TreeNode right;
// TreeNode next;
// TreeNode(int x) {
// val = x;
// left = right = next = null;
// }
// };
class Solution {
public TreeNode connect(TreeNode root) {
if (root == null) return root;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode previousNode = null;
int levelSize = queue.size();
// connect all nodes of this level
for (int i = 0; i < levelSize; i++) {
TreeNode currentNode = queue.poll();
if (previousNode != null) previousNode.next = currentNode;
previousNode = currentNode;
// insert the children of current node in the queue
if (currentNode.left != null) queue.offer(currentNode.left);
if (currentNode.right != null) queue.offer(currentNode.right);
}
}
return root;
}
// level order traversal using 'next' pointer
public static void printLevelOrder(TreeNode root) {
TreeNode nextLevelRoot = root;
while (nextLevelRoot != null) {
TreeNode current = nextLevelRoot;
nextLevelRoot = null;
while (current != null) {
System.out.print(current.val + " ");
if (nextLevelRoot == null) {
if (current.left != null) nextLevelRoot = current.left;
else if (current.right != null) nextLevelRoot = current.right;
}
current = current.next;
}
System.out.println();
}
}
public static void main(String[] args) {
Solution sol = new Solution();
TreeNode root = new TreeNode(12);
root.left = new TreeNode(7);
root.right = new TreeNode(1);
root.left.left = new TreeNode(9);
root.right.left = new TreeNode(10);
root.right.right = new TreeNode(5);
root = sol.connect(root);
System.out.println("Level order traversal using 'next' pointer: ");
printLevelOrder(root);
}
}
Complexity Analysis
Time Complexity
The time complexity of the above algorithm is
Space Complexity
The space complexity of the above algorithm will be
🤖 Don't fully get this? Learn it with Claude
Stuck on Connect Level Order Siblings? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.
Progressively stronger hints — you still solve it.
I'm working on the problem **Connect Level Order Siblings** (DSA). Give me a HINT LADDER: start with the tiniest nudge, then wait. Only reveal the next, stronger hint when I ask. Do NOT show the full solution unless I type 'show solution'. Keep me doing the thinking. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
See the technique, not just code.
Explain the optimal approach to **Connect Level Order Siblings** with a VISUAL walkthrough: trace it on a small concrete example using ASCII art / a step-by-step diagram, narrate what changes each step, then give time & space complexity with a one-line derivation. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Catch bugs, edge cases, sub-optimality.
I'll paste my solution to **Connect Level Order Siblings**. Review it for correctness, missed edge cases, and time/space complexity, then coach me toward the optimal — don't just rewrite it. Ask me to paste my code now. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Lock in recognition with look-alikes.
Give me 2 problems that use the SAME underlying pattern as **Connect Level Order Siblings**. For each, let me attempt first, then review my answer and name the trigger signal that reveals the pattern. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.