Overview
Given a tree of n nodes labeled 0 to n-1 and n-1 undirected edges, find all root labels that minimize the tree height. These are called Minimum Height Trees (MHTs).
Constraints
1 <= n <= 20,000- The input forms a valid tree.
- Return at most 2 roots (MHTs always have 1 or 2 roots).
Examples
findMinHeightTrees(4, [[1,0],[1,2],[1,3]]); // => [1] findMinHeightTrees(6, [[3,0],[3,1],[3,2],[3,4],[5,4]]); // => [3, 4]
Solution
Reveal solution
function findMinHeightTrees(n, edges) {
if (n === 1) return [0];
const adj = Array.from({length: n}, () => new Set());
for (const [a, b] of edges) { adj[a].add(b); adj[b].add(a); }
let leaves = [];
for (let i = 0; i < n; i++) if (adj[i].size === 1) leaves.push(i);
let remaining = n;
while (remaining > 2) {
remaining -= leaves.length;
const newLeaves = [];
for (const leaf of leaves) {
const neighbor = [...adj[leaf]][0];
adj[neighbor].delete(leaf);
if (adj[neighbor].size === 1) newLeaves.push(neighbor);
}
leaves = newLeaves;
}
return leaves;
}Iteratively remove leaf nodes (degree 1) until 1 or 2 nodes remain.
Resources
minimum-height-trees.js
Minimum Height Trees
mediumcodingAlgorithmsBFS
Overview
Given a tree of n nodes labeled 0 to n-1 and n-1 undirected edges, find all root labels that minimize the tree height. These are called Minimum Height Trees (MHTs).
Constraints
1 <= n <= 20,000- The input forms a valid tree.
- Return at most 2 roots (MHTs always have 1 or 2 roots).
Examples
findMinHeightTrees(4, [[1,0],[1,2],[1,3]]); // => [1] findMinHeightTrees(6, [[3,0],[3,1],[3,2],[3,4],[5,4]]); // => [3, 4]
Solution
Reveal solution
function findMinHeightTrees(n, edges) {
if (n === 1) return [0];
const adj = Array.from({length: n}, () => new Set());
for (const [a, b] of edges) { adj[a].add(b); adj[b].add(a); }
let leaves = [];
for (let i = 0; i < n; i++) if (adj[i].size === 1) leaves.push(i);
let remaining = n;
while (remaining > 2) {
remaining -= leaves.length;
const newLeaves = [];
for (const leaf of leaves) {
const neighbor = [...adj[leaf]][0];
adj[neighbor].delete(leaf);
if (adj[neighbor].size === 1) newLeaves.push(neighbor);
}
leaves = newLeaves;
}
return leaves;
}Iteratively remove leaf nodes (degree 1) until 1 or 2 nodes remain.
Resources
NameTopicDifficulty
103 of 103 problems