Distancia entre dos Nodes del árbol binario con valores de Node de 1 a N

Dado un árbol binario con 

1
 

como su raíz y para cualquier padre 

i
 

su hijo izquierdo será 2*i y su hijo derecho será 2*i+1 . La tarea es encontrar la distancia mínima entre dos Nodes n1 y n2 .
 

           
               1
            /      \
           2        3
         /  \      / \
        4    5    6   7
      /  \  / \  / \ / \
     .  .  .  . .  .  .  . 

Ejemplos
 

Input : n1 = 7, n2 = 10
Output : 5

Input : n1 = 6, n2 = 7
Output : 4

Hay tantas maneras de encontrar la distancia mínima entre dos Nodes dados de un árbol binario .
Aquí hay una forma eficiente de encontrar lo mismo con la ayuda de la representación binaria de Nodes dados. Para cualquier Node, eche un vistazo más de cerca a su representación binaria. Por ejemplo, considere el Node 9 . La representación binaria de 9 es 1001 . Entonces, para encontrar la ruta desde la raíz hasta un Node, encuentre la representación binaria de ese Node y muévase de izquierda a derecha en esa representación binaria y muévase al niño derecho en el árbol si se encuentra un 1 y muévase al niño izquierdo si se encuentra un 0 . 
 

Path of 9 as per bit representation
        1
       / \
      2   3
     /\   /\
    4  5 6  7
   /\ 
  8  9.

Por lo tanto, para encontrar la distancia mínima entre dos Nodes, intentaremos encontrar la parte común de la representación binaria de ambos Nodes, que en realidad es la ruta común desde la raíz hasta el LCA. Deje que los primeros bits k para ambos Nodes sean iguales. Además, si la forma binaria es de n bits, muestra que la distancia de la ruta desde la raíz hasta ese Node es de n longitud. Por lo tanto, de las declaraciones anteriores podemos concluir fácilmente que: si m y n son la longitud de bit de dos Nodes y los k bits iniciales del valor de ambos Nodes son iguales, entonces la distancia mínima entre ambos Nodes será: m + n – 2* k .
Nota: El último bit similar muestra la posición de LCA en el árbol binario dado.
A continuación se muestra la implementación del enfoque anterior:
 

C++

// C++ program to find minimum distance between
// two nodes in binary tree
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to get minimum path distance
int minDistance(int n1, int n2)
{
    /** find the 1st dis-similar bit **/
    // count bit length of n1 and n2
    int bitCount1 = floor(log2(n1)) + 1;
    int bitCount2 = floor(log2(n2)) + 1;
 
    // find bit difference and maxBit
    int bitDiff = abs(bitCount1 - bitCount2);
    int maxBitCount = max(bitCount1, bitCount2);
 
    if (bitCount1 > bitCount2) {
        n2 = n2 * pow(2, bitDiff);
    }
    else {
        n1 = n1 * pow(2, bitDiff);
    }
 
    int xorValue = n1 ^ n2;
    int bitCountXorValue;
   
      if( xorValue == 0)
      bitCountXorValue = 1;
    else
    {
       bitCountXorValue = floor(log2(xorValue)) + 1;
    }
    int disSimilarBitPosition = maxBitCount -
                                     bitCountXorValue;
   
    // calculate result by formula
    int result = bitCount1 + bitCount2 -
                         2 * disSimilarBitPosition;
    return result;
}
 
// Driver program
int main()
{
    int n1 = 12, n2 = 5;
 
    cout << minDistance(n1, n2);
 
    return 0;
}

Java

// Java program to find minimum distance between
// two nodes in binary tree
import java.util.*;
 
class GFG
{
    // Function to get minimum path distance
    static int minDistance(int n1, int n2)
    {
        /** find the 1st dis-similar bit **/
        // count bit length of n1 and n2
     
        int bitCount1 =(int) Math.floor((Math.log(n1) /
                        Math.log(2))) + 1;
        int bitCount2 = (int)Math.floor((Math.log(n2) /
                        Math.log(2))) + 1;
 
        // find bit difference and maxBit
        int bitDiff = Math.abs(bitCount1 - bitCount2);
        int maxBitCount = Math.max(bitCount1, bitCount2);
 
        if (bitCount1 > bitCount2)
        {
            n2 = n2 *(int) Math.pow(2, bitDiff);
        }
        else   
        {
            n1 = n1 *(int) Math.pow(2, bitDiff);
        }
       
       
        int xorValue = n1 ^ n2;
        int bitCountXorValue;
       
        if( xorValue == 0)
          bitCountXorValue = 1;
        else
        {
           bitCountXorValue = (int)Math.floor((Math.log(xorValue) /
                                Math.log(2))) + 1;
        }
        int disSimilarBitPosition = maxBitCount -
                                         bitCountXorValue;
        
 
        // calculate result by formula
        int result = bitCount1 + bitCount2 - 2 * disSimilarBitPosition;
        return result;
    }
 
    // Driver program
    public static void main(String args[])
    {
        int n1 = 12, n2 = 5;
        System.out.println(minDistance(n1, n2));
    }
}
 
// This code is contributed by
// Sanjit_Prasad

Python3

# Python 3 program to find minimum distance
# between two nodes in binary tree
from math import log2
 
# Function to get minimum path distance
def minDistance(n1, n2):
     
    # find the 1st dis-similar bit
    # count bit length of n1 and n2
    bitCount1 = int(log2(n1)) + 1
    bitCount2 = int(log2(n2)) + 1
 
    # find bit difference and maxBit
    bitDiff = abs(bitCount1 - bitCount2)
    maxBitCount = max(bitCount1, bitCount2)
 
    if (bitCount1 > bitCount2):
        n2 = int(n2 * pow(2, bitDiff))
     
    else:
        n1 = int(n1 * pow(2, bitDiff))
 
    xorValue = n1 ^ n2
    if xorValue == 0:
        bitCountXorValue = 1
    else:
        bitCountXorValue = int(log2(xorValue)) + 1
    disSimilarBitPosition = (maxBitCount -
                             bitCountXorValue)
 
    # calculate result by formula
    result = (bitCount1 + bitCount2 - 2 *
                   disSimilarBitPosition)
    return result
 
# Driver Code
if __name__ == '__main__':
    n1 = 12
    n2 = 5
 
    print(minDistance(n1, n2))
 
# This code is contributed by
# Surendra_Gangwar

C#

// C# program to find minimum distance between
// two nodes in binary tree
using System;
     
class GFG
{
    // Function to get minimum path distance
    static int minDistance(int n1, int n2)
    {
        /** find the 1st dis-similar bit **/
        // count bit length of n1 and n2
     
        int bitCount1 =(int) Math.Floor((Math.Log(n1) /
                        Math.Log(2))) + 1;
        int bitCount2 = (int)Math.Floor((Math.Log(n2) /
                        Math.Log(2))) + 1;
 
        // find bit difference and maxBit
        int bitDiff = Math.Abs(bitCount1 - bitCount2);
        int maxBitCount = Math.Max(bitCount1, bitCount2);
 
        if (bitCount1 > bitCount2)
        {
            n2 = n2 *(int) Math.Pow(2, bitDiff);
        }
        else
        {
            n1 = n1 *(int) Math.Pow(2, bitDiff);
        }
 
        int xorValue = n1 ^ n2;
        
       
        int bitCountXorValue;
       
        if( xorValue == 0)
          bitCountXorValue = 1;
        else
        {
           bitCountXorValue = (int)Math.Floor((Math.Log(xorValue) /
                                Math.Log(2))) + 1;
        }
         
        int disSimilarBitPosition = maxBitCount - bitCountXorValue;
 
        // calculate result by formula
        int result = bitCount1 + bitCount2 - 2 * disSimilarBitPosition;
        return result;
    }
 
    // Driver code
    public static void Main(String []args)
    {
        int n1 = 12, n2 = 5;
        Console.WriteLine(minDistance(n1, n2));
    }
}
 
/* This code contributed by PrinciRaj1992 */

PHP

<?php
// PHP program to find minimum distance
// between two nodes in binary tree
 
// Function to get minimum path distance
function minDistance($n1, $n2)
{
    /** find the 1st dis-similar bit **/
    // count bit length of n1 and n2
    $bitCount1 = floor(log($n1, 2)) + 1;
    $bitCount2 = floor(log($n2, 2)) + 1;
 
    // find bit difference and maxBit
    $bitDiff = abs($bitCount1 - $bitCount2);
    $maxBitCount = max($bitCount1, $bitCount2);
 
    if ($bitCount1 > $bitCount2)
    {
        $n2 = $n2 * pow(2, $bitDiff);
    }
    else
    {
        $n1 = $n1 * pow(2, $bitDiff);
    }
 
    $xorValue = $n1 ^ $n2;
    $bitCountXorValue = floor(log($xorValue, 2)) + 1;
    $disSimilarBitPosition = $maxBitCount -
                             $bitCountXorValue;
 
    // calculate result by formula
    $result = $bitCount1 + $bitCount2 - 2 *
              $disSimilarBitPosition;
    return $result;
}
 
// Driver Code
$n1 = 12;
$n2 = 5;
 
echo minDistance($n1, $n2);
 
// This code is contributed by akt_mit
?>

Javascript

<script>
 
 
// Javascript program to find minimum distance between
// two nodes in binary tree
 
// Function to get minimum path distance
function minDistance(n1, n2)
{
    /** find the 1st dis-similar bit **/
    // count bit length of n1 and n2
    var bitCount1 = Math.floor(Math.log2(n1)) + 1;
    var bitCount2 = Math.floor(Math.log2(n2)) + 1;
 
    // find bit difference and maxBit
    var bitDiff = Math.abs(bitCount1 - bitCount2);
    var maxBitCount = Math.max(bitCount1, bitCount2);
 
    if (bitCount1 > bitCount2) {
        n2 = n2 * Math.pow(2, bitDiff);
    }
    else {
        n1 = n1 * Math.pow(2, bitDiff);
    }
 
    var xorValue = n1 ^ n2;
    var bitCountXorValue;
   
      if( xorValue == 0)
      bitCountXorValue = 1;
    else
    {
       bitCountXorValue = Math.floor(Math.log2(xorValue)) + 1;
    }
    var disSimilarBitPosition = maxBitCount -
                                     bitCountXorValue;
   
    // calculate result by formula
    var result = bitCount1 + bitCount2 -
                         2 * disSimilarBitPosition;
    return result;
}
 
// Driver program
var n1 = 12, n2 = 5;
document.write( minDistance(n1, n2));
 
</script>
Producción: 

5

 

Publicación traducida automáticamente

Artículo escrito por Shivam.Pradhan y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *