Given a binary tree, the task is to find the distance between two keys in a binary tree, no parent pointers are given. Distance between two nodes is the minimum number of edges to be traversed to reach one node from other.
This problem has been already discussed in previous post but it uses three traversals of the Binary tree, one for finding Lowest Common Ancestor(LCA) of two nodes(let A and B) and then two traversals for finding distance between LCA and A and LCA and B which has O(n) time complexity. In this post, a method will be discussed that requires the O(log(n)) time to find LCA of two nodes.
The distance between two nodes can be obtained in terms of lowest common ancestor. Following is the formula.
Dist(n1, n2) = Dist(root, n1) + Dist(root, n2) - 2*Dist(root, lca) 'n1' and 'n2' are the two given keys 'root' is root of given Binary Tree. 'lca' is lowest common ancestor of n1 and n2 Dist(n1, n2) is the distance between n1 and n2.
Above formula can also be written as:
Dist(n1, n2) = Level[n1] + Level[n2] - 2*Level[lca]
This problem can be breakdown into:
- Finding levels of each node
- Finding the Euler tour of binary tree
- Building segment tree for LCA,
These steps are explained below :
- Find the levels of each node by applying level order traversal.
- Find the LCA of two nodes in binary tree in O(logn) by Storing Euler tour of Binary tree in array and computing two other arrays with the help of levels of each node and Euler tour.
These steps are shown below:
(I) First, find Euler Tour of binary tree.
(II) Then, store levels of each node in Euler array in a different array.
(III) Then, store First occurrences of all nodes of binary tree in Euler array. H stores the indices of nodes from Euler array, so that range of query for finding minimum can be minimized and their by further optimizing the query time.
- Then build segment tree on L array and take the low and high values from H array that will give us the first occurrences of say Two nodes(A and B) . Then, <strong>we query segment tree to find the minimum value say X in range (H[A] to H[B]). Then we use the index of value X as index to Euler array to get LCA, i.e. Euler[index(X)].
Let, A = 8 and B = 5.
(I) H = 1 and H =2
(II) Querying on Segment tree, we get min value in L array between 1 and 2 as X=0, index=7
(III) Then, LCA= Euler, i.e LCA = 1.
- Finally, we apply distance formula discussed above to get distance between two nodes.
Dist(4, 5) = 2 Dist(4, 6) = 4 Dist(3, 4) = 3 Dist(2, 4) = 1 Dist(8, 5) = 5
Time Complexity: O(Log N)
Space Complexity: O(N)
- Find distance between two nodes in the given Binary tree for Q queries
- Queries to find distance between two nodes of a Binary tree
- Find distance of nodes from root in a tree for multiple queries
- Find distance between two nodes of a Binary Tree
- Queries to find the maximum Xor value between X and the nodes of a given level of a perfect binary tree
- Distance between two nodes of binary tree with node values from 1 to N
- Shortest distance between two nodes in an infinite binary tree
- Binary Array Range Queries to find the minimum distance between two Zeros
- Find the path from root to the given nodes of a tree for multiple queries
- Find distance from root to given node in a binary tree
- Find maximum among all right nodes in Binary Tree
- Find sum of all nodes of the given perfect binary tree
- Find height of a special binary tree whose leaf nodes are connected
- Queries to check if the path between two nodes in a tree is a palindrome
- Minimum distance to visit all the nodes of an undirected weighted tree
- Construct XOR tree by Given leaf nodes of Perfect Binary Tree
- Find count of pair of nodes at even distance
- Find the shortest distance between any pair of two different good nodes
- Iterative method to find ancestors of a given binary tree
- Iterative Method to find Height of Binary Tree