Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 4cb60e3

Browse files
Create LCA_RMQ.cpp
1 parent 551c065 commit 4cb60e3

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed

‎Lowest Common Ancestor/LCA_RMQ.cpp

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
/* Author : Ashutosh Maurya
2+
*/
3+
#include <stdio.h>
4+
#include <stdbool.h>
5+
#include <limits.h>
6+
#define MAX 100 // Let this be maximum number of nodes in our Binary Tree
7+
#define max(a,b) ( (a>b)?a:b )
8+
#define min(a,b) ( (a<b)?a:b )
9+
10+
int euler[2*MAX - 1]; // Euler Tour Array ( DFS Traversal in a Tree )
11+
bool visited[MAX+1]; // Level of Nodes in Tour Array
12+
int first[MAX+1]; // To Store the idx of first occuurence of the node in Euler Tour
13+
int idx,nodes;
14+
int segtree[2*MAX - 1];
15+
16+
void initialize(){
17+
int i;
18+
for(i=0;i<=(2*MAX-2);i++){
19+
if(i<=MAX)
20+
first[i]=-1,visited[i]=false;
21+
euler[i]=0,segtree[i]=0;
22+
}
23+
}
24+
25+
void build(int node,int start,int end){
26+
int mid;
27+
if(start==end)
28+
segtree[node]=euler[start];
29+
else {
30+
mid=(start+end)/2;
31+
build(2*node,start,mid); // left sub Segment tree
32+
build(2*node+1,mid+1,end); // right sub Segment tree
33+
int x=segtree[2*node];
34+
int y=segtree[2*node+1];
35+
segtree[node]=(x>y)?y:x;
36+
}
37+
}
38+
39+
int query (int node,int start,int end, int l, int r){
40+
int mid,x,y;
41+
if(r<start || end<l)
42+
return INT_MAX;
43+
if(l<=start && end<=r)
44+
return segtree[node];
45+
mid=(start+end)/2;
46+
x=query(2*node,start,mid,l,r);
47+
y=query(2*node+1,mid+1,end,l,r);
48+
return ((x>y)?y:x);
49+
}
50+
51+
void dfs_eulertour(int node,int l){
52+
if(node <= nodes){
53+
euler[idx]=node;
54+
idx++;
55+
56+
if(visited[node]==false){
57+
visited[node]=true;
58+
first[node]=idx-1;
59+
}
60+
// Left SubTree
61+
if(2*node <= nodes){
62+
dfs_eulertour(2*node,l+1);
63+
euler[idx]=node;
64+
idx++;
65+
}
66+
// Right Subtree
67+
if((2*node+1) <= nodes ){
68+
dfs_eulertour(2*node+1,l+1);
69+
euler[idx]=node;
70+
idx++;
71+
}
72+
}
73+
}
74+
75+
int findLCA(int u,int v){
76+
int i;
77+
idx=0;
78+
dfs_eulertour(1,0);
79+
printf("Euler-Tour Array : ");
80+
for(i=0;i<(2*nodes-1);i++){
81+
printf("%d ",euler[i]);
82+
}
83+
printf("\n");
84+
build(1,0,2*nodes-2); // Building Segment Tree from Euler Tour
85+
return query(1,0,2*nodes-2,min(first[u],first[v]),max(first[v],first[u]));
86+
}
87+
88+
int main() {
89+
int t,u,v;
90+
printf("Enter the number of nodes in the Binary Tree : ");
91+
scanf("%d",&nodes);
92+
printf("Enter the Number of Queries on Binary Tree : ");
93+
scanf("%d",&t);
94+
while(t--){
95+
initialize();
96+
printf("Find LCA of two nodes (U,V) : ");
97+
scanf("%d%d",&u,&v);
98+
printf("%d\n",findLCA(u,v));
99+
}
100+
return 0;
101+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /