From 8c3a46648a9e92d4d4e83173dac1d0d499b9a032 Mon Sep 17 00:00:00 2001 From: chayan das <110921638+Chayandas07@users.noreply.github.com> Date: Wed, 24 Apr 2024 02:40:00 +0530 Subject: [PATCH] Create 310. Minimum Height Trees --- 310. Minimum Height Trees | 54 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 310. Minimum Height Trees diff --git a/310. Minimum Height Trees b/310. Minimum Height Trees new file mode 100644 index 0000000..0bfa4bc --- /dev/null +++ b/310. Minimum Height Trees @@ -0,0 +1,54 @@ + +class Solution { +public: + vector findMinHeightTrees(int n, vector>& edges) { + if(edges.size() == 0) { + vector tmp; + tmp.push_back(0); + return tmp; + } + unordered_map> adj; + + // creating adjacency list + for (int i = 0; i < edges.size(); i++) { + int u = edges[i][0]; + int v = edges[i][1]; + adj[u].push_back(v); + adj[v].push_back(u); + } + + vector leaves; // Stores current leaf nodes + + // Initialize leaves with nodes having only 1 adjacent node + for(auto& d : adj) { + if(d.second.size() == 1) { + leaves.push_back(d.first); + } + } + + // answer can consist of max. 2 nodes (Reason explained above) + while(n > 2) { + vector new_leaves; + + // remove current leaves + n -= leaves.size(); + + for(int leaf : leaves) { + // get the only neighbour of leaf + int neighbor = adj[leaf].front(); + // remove leaf from neighbour's adjacency list + adj[neighbor].remove(leaf); + + // if the adjacent node becomes a leaf node after removal, add it to the queue. + if(adj[neighbor].size() == 1) { + new_leaves.push_back(neighbor); + } + } + + // update current no of leaf nodes + leaves = new_leaves; + } + + return leaves; + } +};