diff --git a/dynamic_programming/tree_height.cpp b/dynamic_programming/tree_height.cpp new file mode 100644 index 000000000..6acc15959 --- /dev/null +++ b/dynamic_programming/tree_height.cpp @@ -0,0 +1,70 @@ +// C++ Program to find height of the tree using bottom-up dynamic programming. + +/* + * Given a rooted tree with node 1. + * Task is to find the height of the tree. + * Example: - + * 4 + * 1 2 + * 1 3 + * 2 4 + * which can be represented as + * 1 + * / \ + * 2 3 + * | + * 4 + * + * Height of the tree : - 2 +*/ + +#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 depth_first_search(int u) { + visited[u] = true; + int child_height = 1; + for (int v : adj[u]) { + if (!visited[v]) { + depth_first_search(v); + + // select maximum sub-tree height from all children. + 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 number_of_nodes; + std::cout << "Enter number of nodes of the tree : " << std::endl; + std::cin >> number_of_nodes; + + // u, v denotes an undirected edge of tree. + int u, v; + // Tree contains exactly n-1 edges where n denotes the number of nodes. + std::cout << "Enter edges of the tree : " << std::endl; + for (int i = 0; i < number_of_nodes - 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(number_of_nodes+1, false); + // initialize depth of all nodes to 0. + dp.assign(number_of_nodes+1, 0); + // function call which will initialize the height of all nodes. + depth_first_search(1); + std::cout << "Height of the Tree : " << dp[1] << std::endl; +}