Max GCD of Siblings in a Binary Tree Given as List of Edges
Last Updated : 2 Jun, 2026
Given a 2D list that represents the nodes of a Binary tree with n nodes, find the maximum GCD of the siblings of this tree without actually constructing it. If there are no pairs of siblings in the given tree, print 0. Also, if given that there's an edge between a and b in the form of [a,b] in the list, then a is the parent node.
[Naive Approach] Using Nested Traversal - O(E^2 * log(V)) Time O(1) Space
The idea is to compare every pair of edges and check whether both edges have the same parent node. If two edges have the same parent, then their child nodes are siblings. Compute the GCD of such sibling pairs and maintain the maximum GCD obtained among all pairs.
C++
#include<iostream>usingnamespacestd;intmaxBinTreeGCD(vector<vector<int>>&arr){intn=arr.size();intres=0;// Compare every pair of edgesfor(inti=0;i<n;i++){for(intj=i+1;j<n;j++){// Same parent means siblingsif(arr[i][0]==arr[j][0]){res=max(res,__gcd(arr[i][1],arr[j][1]));}}}returnres;}// Driver Codeintmain(){vector<vector<int>>arr={{4,5},{4,2},{2,3},{2,1},{3,6},{3,12}};cout<<maxBinTreeGCD(arr);return0;}
Java
importjava.util.ArrayList;importjava.util.List;publicclassGfG{staticintgcd(inta,intb){if(b==0){returna;}returngcd(b,a%b);}staticintmaxBinTreeGCD(List<List<Integer>>arr){intn=arr.size();intres=0;// Compare every pair of edgesfor(inti=0;i<n;i++){for(intj=i+1;j<n;j++){// Same parent means siblingsif(arr.get(i).get(0)==arr.get(j).get(0)){res=Math.max(res,gcd(arr.get(i).get(1),arr.get(j).get(1)));}}}returnres;}publicstaticvoidmain(String[]args){List<List<Integer>>arr=newArrayList<>();arr.add(newArrayList<>(List.of(4,5)));arr.add(newArrayList<>(List.of(4,2)));arr.add(newArrayList<>(List.of(2,3)));arr.add(newArrayList<>(List.of(2,1)));arr.add(newArrayList<>(List.of(3,6)));arr.add(newArrayList<>(List.of(3,12)));System.out.println(maxBinTreeGCD(arr));}}
Python
frommathimportgcdfromtypingimportListdefmaxBinTreeGCD(arr:List[List[int]])->int:n=len(arr)res=0# Compare every pair of edgesforiinrange(n):forjinrange(i+1,n):# Same parent means siblingsifarr[i][0]==arr[j][0]:res=max(res,gcd(arr[i][1],arr[j][1]))returnres# Driver Codeif__name__=="__main__":arr=[[4,5],[4,2],[2,3],[2,1],[3,6],[3,12]]print(maxBinTreeGCD(arr))
C#
usingSystem;usingSystem.Collections.Generic;publicclassGfG{publicintGCD(inta,intb){if(b==0)returna;returnGCD(b,a%b);}publicintmaxBinTreeGCD(List<List<int>>arr){intn=arr.Count;intres=0;// Compare every pair of edgesfor(inti=0;i<n;i++){for(intj=i+1;j<n;j++){// Same parent means siblingsif(arr[i][0]==arr[j][0]){res=Math.Max(res,GCD(arr[i][1],arr[j][1]));}}}returnres;}publicstaticvoidMain(){List<List<int>>arr=newList<List<int>>{newList<int>{4,5},newList<int>{4,2},newList<int>{2,3},newList<int>{2,1},newList<int>{3,6},newList<int>{3,12}};GfGobj=newGfG();Console.WriteLine(obj.maxBinTreeGCD(arr));}}
JavaScript
functiongcd(a,b){if(b===0){returna;}returngcd(b,a%b);}functionmaxBinTreeGCD(arr){letn=arr.length;letres=0;// Compare every pair of edgesfor(leti=0;i<n;i++){for(letj=i+1;j<n;j++){// Same parent means siblingsif(arr[i][0]===arr[j][0]){res=Math.max(res,gcd(arr[i][1],arr[j][1]));}}}returnres;}// Driver Codeletarr=[[4,5],[4,2],[2,3],[2,1],[3,6],[3,12]];console.log(maxBinTreeGCD(arr));
Output
6
Time Complexity: O(E^2 * log(V)) Auxiliary Space: O(1)
[Expected Approach] Using Sorting and Adjacent Comparison - O(E * log(E)) Time O(1) Space
The idea is to sort the edges based on the parent node. After sorting, children belonging to the same parent become adjacent in the array. Traverse the sorted edges and whenever two consecutive edges have the same parent, they form a sibling pair. Compute the GCD of those sibling nodes and update the maximum GCD obtained.
Let us understand with example: Input: arr = [[4, 5], [4, 2], [2, 3], [2, 1], [3, 6], [3, 12]] After sorting: [[2, 1], [2, 3], [3, 6], [3, 12], [4, 2], [4, 5]]
Compare [2, 1] and [2, 3] -> Same parent 2, GCD(1, 3) = 1, so res = 1.
Compare [3, 6] and [3, 12] -> Same parent 3, GCD(6, 12) = 6, so res = 6.
Compare [4, 2] and [4, 5] -> Same parent 4, GCD(2, 5) = 1, so res remains 6.
Final Output: 6
C++
#include<iostream>usingnamespacestd;intmaxBinTreeGCD(vector<vector<int>>&arr){// Need at least 2 edges to form siblingsif(arr.size()<2)return0;// Sort by parent nodesort(arr.begin(),arr.end());intres=0;// Compare adjacent edgesfor(inti=1;i<arr.size();i++){// Same parent => siblingsif(arr[i][0]==arr[i-1][0]){res=max(res,__gcd(arr[i][1],arr[i-1][1]));}}returnres;}// Driver Codeintmain(){vector<vector<int>>arr={{4,5},{4,2},{2,3},{2,1},{3,6},{3,12}};cout<<maxBinTreeGCD(arr);return0;}
Java
importjava.util.ArrayList;importjava.util.Arrays;importjava.util.Collections;importjava.util.List;publicclassGfG{publicstaticintgcd(inta,intb){if(b==0){returna;}returngcd(b,a%b);}publicstaticintmaxBinTreeGCD(List<List<Integer>>arr){// Need at least 2 edges to form siblingsif(arr.size()<2)return0;// Sort by parent nodeCollections.sort(arr,(a,b)->a.get(0).compareTo(b.get(0)));intres=0;// Compare adjacent edgesfor(inti=1;i<arr.size();i++){// Same parent => siblingsif(arr.get(i).get(0).equals(arr.get(i-1).get(0))){res=Math.max(res,gcd(arr.get(i).get(1),arr.get(i-1).get(1)));}}returnres;}publicstaticvoidmain(String[]args){List<List<Integer>>arr=newArrayList<>();arr.add(Arrays.asList(4,5));arr.add(Arrays.asList(4,2));arr.add(Arrays.asList(2,3));arr.add(Arrays.asList(2,1));arr.add(Arrays.asList(3,6));arr.add(Arrays.asList(3,12));System.out.println(maxBinTreeGCD(arr));}}
Python
frommathimportgcddefmaxBinTreeGCD(arr):# Need at least 2 edges to form siblingsiflen(arr)<2:return0# Sort by parent nodearr.sort(key=lambdax:x[0])res=0# Compare adjacent edgesforiinrange(1,len(arr)):# Same parent => siblingsifarr[i][0]==arr[i-1][0]:res=max(res,gcd(arr[i][1],arr[i-1][1]))returnres# Driver Codeif__name__=="__main__":arr=[[4,5],[4,2],[2,3],[2,1],[3,6],[3,12]]print(maxBinTreeGCD(arr))
C#
usingSystem;usingSystem.Collections.Generic;classGfG{staticintGCD(inta,intb){if(b==0)returna;returnGCD(b,a%b);}staticintmaxBinTreeGCD(List<List<int>>arr){// Need at least 2 edges to form siblingsif(arr.Count<2)return0;// Sort by parent nodearr.Sort(delegate(List<int>a,List<int>b){if(a[0]!=b[0])returna[0].CompareTo(b[0]);returna[1].CompareTo(b[1]);});intres=0;// Compare adjacent edgesfor(inti=1;i<arr.Count;i++){// Same parent => siblingsif(arr[i][0]==arr[i-1][0]){res=Math.Max(res,GCD(arr[i][1],arr[i-1][1]));}}returnres;}staticintMain(){List<List<int>>arr=newList<List<int>>{newList<int>{4,5},newList<int>{4,2},newList<int>{2,3},newList<int>{2,1},newList<int>{3,6},newList<int>{3,12}};Console.WriteLine(maxBinTreeGCD(arr));return0;}}
JavaScript
functiongcd(a,b){if(b===0){returna;}returngcd(b,a%b);}functionmaxBinTreeGCD(arr){// Need at least 2 edges to form siblingsif(arr.length<2){return0;}// Sort by parent nodearr.sort((a,b)=>a[0]-b[0]);letres=0;// Compare adjacent edgesfor(leti=1;i<arr.length;i++){// Same parent => siblingsif(arr[i][0]===arr[i-1][0]){res=Math.max(res,gcd(arr[i][1],arr[i-1][1]));}}returnres;}// Driver Codeconstarr=[[4,5],[4,2],[2,3],[2,1],[3,6],[3,12]];console.log(maxBinTreeGCD(arr));
Output
6
Time Complexity: O(E * log(E)) Auxiliary Space: O(1)