int height(TreeNode* n) { return n ? 1 + max(height(n->left), height(n->right)) : 0; }
void collect(TreeNode* node, int level, vector<int>& out) {
if (!node) return;
if (level == 0) { out.push_back(node->val); return; }
collect(node->left, level - 1, out);
collect(node->right, level - 1, out);
}
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
int h = height(root);
for (int level = 0; level < h; level++) {
vector<int> vals;
collect(root, level, vals);
result.push_back(vals);
}
return result;
}
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
int h = height(root);
for (int level = 0; level < h; level++) {
List<Integer> vals = new ArrayList<>();
collect(root, level, vals);
result.add(vals);
}
return result;
}
private int height(TreeNode n) { return n == null ? 0 : 1 + Math.max(height(n.left), height(n.right)); }
private void collect(TreeNode node, int level, List<Integer> out) {
if (node == null) return;
if (level == 0) { out.add(node.val); return; }
collect(node.left, level - 1, out);
collect(node.right, level - 1, out);
}
def level_order(root):
result = []
h = height(root)
for level in range(h):
vals = []
collect(root, level, vals)
result.append(vals)
return result
def height(node):
return 1 + max(height(node.left), height(node.right)) if node else 0
def collect(node, level, out):
if not node: return
if level == 0:
out.append(node.val)
return
collect(node.left, level - 1, out)
collect(node.right, level - 1, out)
function levelOrder(root: TreeNode | null): number[][] {
const result: number[][] = [];
const h = height(root);
for (let level = 0; level < h; level++) {
const vals: number[] = [];
collect(root, level, vals);
result.push(vals);
}
return result;
}
function height(node: TreeNode | null): number {
return node ? 1 + Math.max(height(node.left), height(node.right)) : 0;
}
function collect(node: TreeNode | null, level: number, out: number[]): void {
if (!node) return;
if (level === 0) { out.push(node.val); return; }
collect(node.left, level - 1, out);
collect(node.right, level - 1, out);
}
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result;
function<void(TreeNode*, int)> dfs = [&](TreeNode* node, int level) {
if (!node) return;
if ((int)result.size() == level) result.push_back({});
result[level].push_back(node->val);
dfs(node->left, level + 1);
dfs(node->right, level + 1);
};
dfs(root, 0);
return result;
}
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
dfs(root, 0, result);
return result;
}
private void dfs(TreeNode node, int level, List<List<Integer>> result) {
if (node == null) return;
if (result.size() == level) result.add(new ArrayList<>());
result.get(level).add(node.val);
dfs(node.left, level + 1, result);
dfs(node.right, level + 1, result);
}
def level_order(root):
result = []
def dfs(node, level):
if not node: return
if len(result) == level: result.append([])
result[level].append(node.val)
dfs(node.left, level + 1)
dfs(node.right, level + 1)
dfs(root, 0)
return result
function levelOrder(root: TreeNode | null): number[][] {
const result: number[][] = [];
const dfs = (node: TreeNode | null, level: number): void => {
if (!node) return;
if (result.length === level) result.push([]);
result[level].push(node.val);
dfs(node.left, level + 1);
dfs(node.right, level + 1);
};
dfs(root, 0);
return result;
}
vector<vector<int>> levelOrder(TreeNode* root) {
if (!root) return {};
vector<vector<int>> result;
vector<TreeNode*> queue = {root};
size_t head = 0;
while (head < queue.size()) {
int size = queue.size() - head;
vector<int> level;
for (int i = 0; i < size; i++) {
TreeNode* node = queue[head++];
level.push_back(node->val);
if (node->left) queue.push_back(node->left);
if (node->right) queue.push_back(node->right);
}
result.push_back(level);
}
return result;
}
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) return new ArrayList<>();
List<List<Integer>> result = new ArrayList<>();
List<TreeNode> queue = new ArrayList<>(); queue.add(root);
int head = 0;
while (head < queue.size()) {
int size = queue.size() - head;
List<Integer> level = new ArrayList<>();
for (int i = 0; i < size; i++) {
TreeNode node = queue.get(head++);
level.add(node.val);
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}
result.add(level);
}
return result;
}
def level_order(root):
if not root: return []
result = []
queue = [root]
head = 0
while head < len(queue):
size = len(queue) - head
level = []
for _ in range(size):
node = queue[head]
head += 1
level.append(node.val)
if node.left: queue.append(node.left)
if node.right: queue.append(node.right)
result.append(level)
return result
function levelOrder(root: TreeNode | null): number[][] {
if (!root) return [];
const result: number[][] = [];
const queue: TreeNode[] = [root];
let head = 0;
while (head < queue.length) {
const size = queue.length - head;
const level: number[] = [];
for (let i = 0; i < size; i++) {
const node = queue[head++];
level.push(node.val);
if (node.left) queue.push(node.left);
if (node.right) queue.push(node.right);
}
result.push(level);
}
return result;
}
vector<vector<int>> levelOrder(TreeNode* root) {
if (!root) return {};
vector<vector<int>> result;
vector<TreeNode*> frontier = {root};
while (!frontier.empty()) {
vector<TreeNode*> next;
vector<int> vals;
for (TreeNode* node : frontier) {
vals.push_back(node->val);
if (node->left) next.push_back(node->left);
if (node->right) next.push_back(node->right);
}
result.push_back(vals);
frontier = next;
}
return result;
}
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) return new ArrayList<>();
List<List<Integer>> result = new ArrayList<>();
List<TreeNode> frontier = new ArrayList<>(); frontier.add(root);
while (!frontier.isEmpty()) {
List<TreeNode> next = new ArrayList<>();
List<Integer> vals = new ArrayList<>();
for (TreeNode node : frontier) {
vals.add(node.val);
if (node.left != null) next.add(node.left);
if (node.right != null) next.add(node.right);
}
result.add(vals);
frontier = next;
}
return result;
}
def level_order(root):
if not root: return []
result = []
frontier = [root]
while frontier:
next_level = []
vals = []
for node in frontier:
vals.append(node.val)
if node.left: next_level.append(node.left)
if node.right: next_level.append(node.right)
result.append(vals)
frontier = next_level
return result
function levelOrder(root: TreeNode | null): number[][] {
if (!root) return [];
const result: number[][] = [];
let frontier: TreeNode[] = [root];
while (frontier.length > 0) {
const next: TreeNode[] = [];
const vals: number[] = [];
for (const node of frontier) {
vals.push(node.val);
if (node.left) next.push(node.left);
if (node.right) next.push(node.right);
}
result.push(vals);
frontier = next;
}
return result;
}