🧠
Brute Force (Recursive Level Collection)
💡 This approach uses recursion to collect nodes at each level by traversing the tree multiple times. It helps beginners understand the problem from a top-down perspective before learning BFS.
Intuition
We recursively traverse the tree and keep track of the current level. For each node, we add its value to a list corresponding to that level. This requires visiting nodes multiple times to build the final list.
Algorithm
- Find the height of the tree.
- For each level from 0 to height-1, recursively collect nodes at that level.
- Append the collected nodes to the result list.
- Return the result list after processing all levels.
💡 This algorithm is hard because it requires two passes: one to find height and multiple to collect nodes per level, which is inefficient but conceptually simple.
from typing import List, Optional
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def height(root: Optional[TreeNode]) -> int:
if not root:
return 0
return 1 + max(height(root.left), height(root.right))
def get_level_nodes(root: Optional[TreeNode], level: int, nodes: List[int]) -> None:
if not root:
return
if level == 0:
nodes.append(root.val)
else:
get_level_nodes(root.left, level - 1, nodes)
get_level_nodes(root.right, level - 1, nodes)
def levelOrder(root: Optional[TreeNode]) -> List[List[int]]:
h = height(root)
result = []
for i in range(h):
level_nodes = []
get_level_nodes(root, i, level_nodes)
result.append(level_nodes)
return result
# Example usage:
# root = TreeNode(3, TreeNode(9), TreeNode(20, TreeNode(15), TreeNode(7)))
# print(levelOrder(root))
Line Notes
def height(root: Optional[TreeNode]) -> int:Defines a helper to compute tree height, needed to know how many levels to process
if not root:Base case for empty subtree returns height 0 to stop recursion
return 1 + max(height(root.left), height(root.right))Height is 1 plus the maximum height of left and right subtrees
def get_level_nodes(root: Optional[TreeNode], level: int, nodes: List[int]) -> None:Helper function to collect all nodes at a specific level
if level == 0:If current level matches target level, append node's value to list
get_level_nodes(root.left, level - 1, nodes)Recurse into left subtree decreasing level by 1
get_level_nodes(root.right, level - 1, nodes)Recurse into right subtree decreasing level by 1
for i in range(h):Iterate over all levels from 0 to height-1 to collect nodes level by level
result.append(level_nodes)Add the collected nodes of the current level to the final result list
import java.util.*;
class TreeNode {
int val;
TreeNode left, right;
TreeNode(int val) { this.val = val; }
}
public class Solution {
public int height(TreeNode root) {
if (root == null) return 0;
return 1 + Math.max(height(root.left), height(root.right));
}
public void getLevelNodes(TreeNode root, int level, List<Integer> nodes) {
if (root == null) return;
if (level == 0) nodes.add(root.val);
else {
getLevelNodes(root.left, level - 1, nodes);
getLevelNodes(root.right, level - 1, nodes);
}
}
public List<List<Integer>> levelOrder(TreeNode root) {
int h = height(root);
List<List<Integer>> result = new ArrayList<>();
for (int i = 0; i < h; i++) {
List<Integer> levelNodes = new ArrayList<>();
getLevelNodes(root, i, levelNodes);
result.add(levelNodes);
}
return result;
}
// Example main
public static void main(String[] args) {
TreeNode root = new TreeNode(3);
root.left = new TreeNode(9);
root.right = new TreeNode(20);
root.right.left = new TreeNode(15);
root.right.right = new TreeNode(7);
Solution sol = new Solution();
System.out.println(sol.levelOrder(root));
}
}
Line Notes
public int height(TreeNode root) {Recursively computes the height of the tree to determine number of levels
if (root == null) return 0;Base case returns 0 for null subtree to stop recursion
return 1 + Math.max(height(root.left), height(root.right));Height is 1 plus max height of left and right children
public void getLevelNodes(TreeNode root, int level, List<Integer> nodes) {Helper method to collect nodes at a specific level recursively
if (level == 0) nodes.add(root.val);If current level matches target, add node's value to list
getLevelNodes(root.left, level - 1, nodes);Recurse into left subtree with decremented level
getLevelNodes(root.right, level - 1, nodes);Recurse into right subtree with decremented level
for (int i = 0; i < h; i++) {Iterate over all levels to collect nodes level by level
result.add(levelNodes);Add collected nodes of current level to final result list
public static void main(String[] args) {Driver code to test the solution with example tree
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct TreeNode {
int val;
TreeNode *left, *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
int height(TreeNode* root) {
if (!root) return 0;
return 1 + max(height(root->left), height(root->right));
}
void getLevelNodes(TreeNode* root, int level, vector<int>& nodes) {
if (!root) return;
if (level == 0) nodes.push_back(root->val);
else {
getLevelNodes(root->left, level - 1, nodes);
getLevelNodes(root->right, level - 1, nodes);
}
}
vector<vector<int>> levelOrder(TreeNode* root) {
int h = height(root);
vector<vector<int>> result;
for (int i = 0; i < h; i++) {
vector<int> levelNodes;
getLevelNodes(root, i, levelNodes);
result.push_back(levelNodes);
}
return result;
}
int main() {
TreeNode* root = new TreeNode(3);
root->left = new TreeNode(9);
root->right = new TreeNode(20);
root->right->left = new TreeNode(15);
root->right->right = new TreeNode(7);
vector<vector<int>> res = levelOrder(root);
for (auto &level : res) {
for (int val : level) cout << val << ' ';
cout << '\n';
}
return 0;
}
Line Notes
int height(TreeNode* root) {Recursive function to compute height of tree for level count
if (!root) return 0;Base case returns 0 for null node to stop recursion
return 1 + max(height(root->left), height(root->right));Height is 1 plus max height of left and right subtrees
void getLevelNodes(TreeNode* root, int level, vector<int>& nodes) {Helper to collect nodes at a specific level recursively
if (level == 0) nodes.push_back(root->val);If current level matches target, add node's value to vector
getLevelNodes(root->left, level - 1, nodes);Recurse into left subtree with decremented level
getLevelNodes(root->right, level - 1, nodes);Recurse into right subtree with decremented level
for (int i = 0; i < h; i++) {Iterate over all levels to collect nodes level by level
result.push_back(levelNodes);Add collected nodes of current level to final result vector
int main() {Driver code to test the function with example tree
class TreeNode {
constructor(val=0, left=null, right=null) {
this.val = val;
this.left = left;
this.right = right;
}
}
function height(root) {
if (!root) return 0;
return 1 + Math.max(height(root.left), height(root.right));
}
function getLevelNodes(root, level, nodes) {
if (!root) return;
if (level === 0) nodes.push(root.val);
else {
getLevelNodes(root.left, level - 1, nodes);
getLevelNodes(root.right, level - 1, nodes);
}
}
function levelOrder(root) {
const h = height(root);
const result = [];
for (let i = 0; i < h; i++) {
const levelNodes = [];
getLevelNodes(root, i, levelNodes);
result.push(levelNodes);
}
return result;
}
// Example usage:
// const root = new TreeNode(3, new TreeNode(9), new TreeNode(20, new TreeNode(15), new TreeNode(7)));
// console.log(levelOrder(root));
Line Notes
function height(root) {Recursively calculates height of tree to determine number of levels
if (!root) return 0;Base case returns 0 for null node to stop recursion
return 1 + Math.max(height(root.left), height(root.right));Height is 1 plus max height of left and right children
function getLevelNodes(root, level, nodes) {Helper function to collect nodes at a specific level recursively
if (level === 0) nodes.push(root.val);If current level matches target, add node's value to array
getLevelNodes(root.left, level - 1, nodes);Recurse into left subtree with decremented level
getLevelNodes(root.right, level - 1, nodes);Recurse into right subtree with decremented level
for (let i = 0; i < h; i++) {Iterate over all levels to collect nodes level by level
result.push(levelNodes);Add collected nodes of current level to final result array
// Example usage:Shows how to test the function with a sample tree
Height calculation is O(n). For each level, getLevelNodes visits nodes, resulting in O(n) work per level. For a skewed tree height ~ n, total O(n^2).
💡 For n=20, this means roughly 400 operations, which is inefficient for large trees.
Interview Verdict: Use only to introduce - not efficient for large inputs
This approach is too slow for big trees but helps understand level order traversal conceptually.