📜  查找二叉树的兄弟姐妹的最大GCD

📅  最后修改于: 2021-05-14 02:16:36             🧑  作者: Mango

给定一个表示二叉树的节点的二维数组arr [] [] ,任务是在不实际构造此树的情况下,找到该树的兄弟姐妹的最大GCD。

例子:

方法:想法是形成一个向量,并以该向量的形式存储树。将树以矢量形式存储后,会发生以下情况:

  • 如果向量大小为0或1 ,则打印0,因为找不到GCD。
  • 对于所有其他情况,由于我们以成对的形式存储树,因此我们考虑了两个对的第一个值并进行比较。但是首先,您需要对这对边进行排序。
    例如,假设向量A和B中有两对。我们检查是否:
A.first == B.first
  • 如果它们都匹配,则它们都属于同一个父对象。因此,我们计算该对中第二个值的GCD,最后打印出所有此类GCD的最大值。

下面是上述方法的实现:

C++
// C++ program to find the maximum
// GCD of the siblings of a binary tree
 
#include 
using namespace std;
 
// Function to find maximum GCD
int max_gcd(vector >& v)
{
    // No child or Single child
    if (v.size() == 1 || v.size() == 0)
        return 0;
   
    sort(v.begin(), v.end());
 
    // To get the first pair
    pair a = v[0];
    pair b;
    int ans = INT_MIN;
    for (int i = 1; i < v.size(); i++) {
        b = v[i];
 
        // If both the pairs belongs to
        // the same parent
        if (b.first == a.first)
 
            // Update ans with the max
            // of current gcd and
            // gcd of both children
            ans
                = max(ans,
                      __gcd(a.second,
                            b.second));
 
        // Update previous
        // for next iteration
        a = b;
    }
    return ans;
}
 
// Driver function
int main()
{
    vector > v;
    v.push_back(make_pair(5, 4));
    v.push_back(make_pair(5, 8));
    v.push_back(make_pair(4, 6));
    v.push_back(make_pair(4, 9));
    v.push_back(make_pair(8, 10));
    v.push_back(make_pair(10, 20));
    v.push_back(make_pair(10, 30));
 
    cout << max_gcd(v);
    return 0;
}


Java
// Java program to find the maximum
// GCD of the siblings of a binary tree
import java.util.*;
import java.lang.*;
 
class GFG{
     
// Function to find maximum GCD
static int max_gcd(ArrayList v)
{
     
    // No child or Single child
    if (v.size() == 1 || v.size() == 0)
        return 0;
   
      Collections.sort(v, new Comparator() {
        public int compare(int[] a, int[] b) {
            return a[0]-b[0];
        }
    });
   
    // To get the first pair
    int[] a = v.get(0);
    int[] b = new int[2];
    int ans = Integer.MIN_VALUE;
     
    for(int i = 1; i < v.size(); i++)
    {
        b = v.get(i);
         
        // If both the pairs belongs to
        // the same parent
        if (b[0] == a[0])
   
            // Update ans with the max
            // of current gcd and
            // gcd of both children
            ans = Math.max(ans,
                           gcd(a[1],
                               b[1]));
       
        // Update previous
        // for next iteration
        a = b;
    }
    return ans;
} 
 
static int gcd(int a, int b)
{
    if (b == 0)
        return a;
         
    return gcd(b, a % b);
}
 
// Driver code
public static void main(String[] args)
{
    ArrayList v = new ArrayList<>();
     
    v.add(new int[]{5, 4});
    v.add(new int[]{5, 8});
    v.add(new int[]{4, 6});
    v.add(new int[]{4, 9});
    v.add(new int[]{8, 10});
    v.add(new int[]{10, 20});
    v.add(new int[]{10, 30});
     
    System.out.println(max_gcd(v));
}
}
 
// This code is contributed by offbeat


Python3
# Python3 program to find the maximum
# GCD of the siblings of a binary tree
from math import gcd
 
# Function to find maximum GCD
def max_gcd(v):
 
    # No child or Single child
    if (len(v) == 1 or len(v) == 0):
        return 0
       
    v.sort()
 
    # To get the first pair
    a = v[0]
    ans = -10**9
    for i in range(1, len(v)):
        b = v[i]
 
        # If both the pairs belongs to
        # the same parent
        if (b[0] == a[0]):
 
            # Update ans with the max
            # of current gcd and
            # gcd of both children
            ans = max(ans, gcd(a[1], b[1]))
 
        # Update previous
        # for next iteration
        a = b
    return ans
 
# Driver function
if __name__ == '__main__':
    v=[]
    v.append([5, 4])
    v.append([5, 8])
    v.append([4, 6])
    v.append([4, 9])
    v.append([8, 10])
    v.append([10, 20])
    v.append([10, 30])
 
    print(max_gcd(v))
 
# This code is contributed by mohit kumar 29


C#
// C# program to find the maximum
// GCD of the siblings of a binary tree
using System.Collections;
using System;
 
class GFG{
      
// Function to find maximum GCD
static int max_gcd(ArrayList v)
{
      
    // No child or Single child
    if (v.Count == 1 || v.Count == 0)
        return 0;
   
    v.Sort();
    
    // To get the first pair
    int[] a = (int [])v[0];
    int[] b = new int[2];
    int ans = -10000000;
      
    for(int i = 1; i < v.Count; i++)
    {
      b = (int[])v[i];
       
      // If both the pairs belongs to
      // the same parent
      if (b[0] == a[0])
         
        // Update ans with the max
        // of current gcd and
        // gcd of both children
        ans = Math.Max(ans, gcd(a[1], b[1]));
       
      // Update previous
      // for next iteration
      a = b;
    }
    return ans;
} 
  
static int gcd(int a, int b)
{
    if (b == 0)
        return a;
          
    return gcd(b, a % b);
}
  
// Driver code
public static void Main(string[] args)
{
    ArrayList v = new ArrayList();
      
    v.Add(new int[]{5, 4});
    v.Add(new int[]{5, 8});
    v.Add(new int[]{4, 6});
    v.Add(new int[]{4, 9});
    v.Add(new int[]{8, 10});
    v.Add(new int[]{10, 20});
    v.Add(new int[]{10, 30});
      
    Console.Write(max_gcd(v));
}
}
 
// This code is contributed by rutvik_56


输出:
10