# LCA in a binary tree using RMQ

The Lowest Common Ancestor (LCA) is a term in graph theory and computer science that is frequently employed in the context of trees, particularly binary trees. The LCA of two nodes in a tree is defined as the lowest (deepest) node that is an ancestor of both nodes.

The LCA is widely used in binary tree settings to find which is the most recent ancestral connection between two nodes. For several reasons,

This concept is commonly used in algorithms as well as data frameworks, including:

1. Binary Tree Algorithms: It is used in various binary tree activities, which include calculating the space between the two nodes, recognizing whether a particular node is a parent of a different one and estimating the pathway connecting two nodes.
2. Lowest Common Ancestor in a Binary Search Tree: The LCA may help discover the common ancestor of two nodes with specific values in binary search trees, which can be beneficial for searching and retrieval.
3. LCA may be utilized in dynamic programming solutions for various tree-related issues, such as determining the diameter of a tree or addressing problems on trees with subtree queries.
4. LCA is utilized in graph algorithms, such as determining the LCA of two nodes in a generic tree, not only binary trees.
5. Parallel Computing: The LCA issue is used as a primitive in parallel computing to solve other problems, such as similar methods for tree contraction.

## RMQ

RMQ stands for "Range Minimum Query," and it relates to the difficulty of locating the smallest member in an array within a specific range. This issue often arises in computer science and data structure applications, including segment trees, sparse tables, and other range-query-related methods.

Here's an explanation of RMQ and how to fix it:

The RMQ issue is to identify the minor element within the subarray arr[left: proper] (inclusive) given an array arr of n items and a range specified by indices left and right (1-based indexing).

## RMQ Solving:

1. The most straightforward technique is to iterate through the elements in the provided range, noting the tiniest element. Because this method has an O(n) time complexity for each query, it could be more efficient for frequent questions on big arrays.

2. Sparse Table Approach: One fast method for solving the RMQ problem is to preprocess the array to create a data structure known as a "sparse table."

-The sparse table is a two-dimensional array in which table[i][j] denotes the smallest member in the range of length 2i beginning at index j.

-It means that compute the remaining entries in the table using the formula: for i ranging from 1 to log2(n) (where n is the size of the array):

-After you've built the sparse table, you can answer RMQ queries in O(1) time by splitting the query range into two overlapping periods covered by distinct rows of the light table and taking the minimum of the associated entries.

3. The segment tree approach is another standard data structure for solving RMQ. A segment tree is a binary tree in which each leaf node represents an array element, and each interior node keeps data about a range of items. The time complexity of building a segment tree for RMQ is O(n), and it allows you to conduct RMQ queries in O(log n) time.

## Algorithm for LCA in a binary tree using RMQ

Finding the Lowest Common Ancestor (LCA) in a binary tree using the Range Minimum Query (RMQ) approach usually entails a preprocessing step to create a data structure (such as a sparse table) that allows you to answer LCA queries effectively. Here's an RMQ algorithm for locating the LCA in a binary tree:

### 1. Preprocessing: Create a Sparse Table for Node Depths:

- Depth-First Traversal (DFS) the binary tree by assigning depths to each node. You may start at the root with depth 0 and work down the tree, increasing the depth as you go.

- Keep track of the sequence in which you meet the nodes as you go. This is the sequence whereby the bare table will be built.

- Set the depths and order of a 1D array to zero. While sequence[i] keeps track of the order during which the i-th node was met throughout the DFS, depths[i] keeps account of the level of that node.

### 2. Create the Depths Sparse Table:

-Create a sparse table similar to the RMQ light table, except this time for node depths. Using the depths array, create a 2D array sparseTable, where sparseTable[i][j] indicates the minimal depth in the range [j, j + 2i - 1].

-Initialize the sparse table's base cases: sparseTable[0][j] = depths[j] for every j.

- Then, using the formula, compute the remaining values in the sparse table:

### 3. Identifying the LCA of Query (u, v):

-Assume you wish to calculate the LCA for nodes u and v.

-Determine the sequence in which these nodes appeared during the DFS. Let u_order and v_order represent the order values for nodes u and v, respectively.

-Check that u_order equals v_order.

-Determine k (the most significant power of two such that 2k = v_order - u_order + 1).

-Find the node with the minor depth between nodes u and v inside the range [u_order, u_order + 2k - 1] using the sparse table. This may be accomplished by utilizing the light table as follows:

### 4. Provide the LCA Node:

As the LCA of nodes u and v, find the node corresponding to the order value lca_order.

Python Code

This code finds the LCA of two nodes in a binary tree using the RMQ technique with a sparse table for depths.

Output:

### Here are some crucial considerations to consider while performing LCA in a binary tree using RMQ:

Efficiency: The RMQ technique finds the LCA in O(1) time after a one-time tree preprocessing, making it very efficient for numerous LCA inquiries.

Preprocessing: The approach performs a Depth-First Traversal (DFS) of the binary tree to construct data structures such as a sparse table or segment tree for RMQ.

These databases can be created in O(N log N) or O(N) time, where N is the total quantity of nodes in the hierarchy.

Versatility: The RMQ data structures may be expanded to handle additional range-based queries on trees and arrays, making them valuable tools in algorithm creation.

Space Complexity: The RMQ data structures, particularly the sparse table and segment tree, require extra memory to store auxiliary data structures. However, the intricacy of the space is realistic and doable.

Flexibility: The RMQ technique is not confined to binary trees but may also be used for generic trees or other graph architectures where the LCA of nodes must be determined.

## Conclusion

The Minimum Query (RMQ) strategy is an effective way to overcome this fundamental challenge. This approach finds the LCA of two nodes in a binary tree using a preprocessing phase that creates a data structure (typically a sparse table or segment tree) to assist speedy searches.

Overall, utilizing RMQ to locate the LCA in a binary tree is a solid and efficient approach, especially when you have numerous LCA queries on the same tree. It uses the power of data structures to optimize a fundamental operation in tree-related algorithms and applications.