diff --git a/dynamic_programming/tree_height.cpp b/dynamic_programming/tree_height.cpp new file mode 100644 index 000000000..2ef9f6b6b --- /dev/null +++ b/dynamic_programming/tree_height.cpp @@ -0,0 +1,67 @@ +/// C++ Program to find height of the tree using bottom0-up DP. + +/** + * Given a rooted tree with node 1. + * Task is to find the height of the tree. +**/ + +#include +#include + + +/// global declarations + +/// no of nodes max limit. +const int MAX = 1e5; + +/// adjacency list +std::vector adj[MAX]; + +std::vector visited; +std::vector dp; + +void dp_with_dfs(int u) { + visited[u] = true; + int child_height = 1; + for (int v : adj[u]) { + if (!visited[v]) { + dp_with_dfs(v); + + /// selected maximum subtree height from all childs. + child_height = std::max(child_height, dp[v]+1); + } + } + + /// assigned the max child height to current visited node. + dp[u] = child_height; +} + +int main(){ + + /// number of nodes + int n; + std::cin >> n; + + int u,v; + + /// a valid tree contains exactly n-1 edges where n denotes the nodes. + for (int i=0; i < n-1; i++) { + std::cin >> u >> v; + + /// undirected tree u -> v and v -> u. + adj[u].push_back(v); + adj[v].push_back(u); + } + + /// initialize all nodes as unvisited. + visited.assign(n+1,false); + + /// initialize depth of all nodes to 0. + dp.assign(n+1,0); + + /// call to dp_with_dfs which will initialize the height of all nodes in dp vector. + dp_with_dfs (1); + + std::cout << dp[1] << std::endl; +} +