Encuentra todos los niveles duplicados del árbol binario dado

Dada la raíz de un árbol binario en el que todos los Nodes tienen valores 0 o 1 , la tarea es encontrar e imprimir todos los niveles para los que existe otro nivel de modo que la representación decimal de cada uno sea la misma. Si no existe tal nivel, devuelve una lista vacía. 

Ejemplos:

Entrada: 
               1                      
           / \                   
         0 1                 
       / \ /             
    1 0 1    
        / \
      0 1
    /
  1
Salida:   {3, 1}, {4, 0}
Explicación: el  nivel 3 es un duplicado del nivel 1
El nivel 4 es un duplicado del nivel 0

Entrada: 1
Salida: { }

 

Planteamiento: La idea para resolver el problema se basa en la siguiente observación:

La idea es realizar un recorrido por orden de niveles de un árbol determinado y, para cada nivel, convertir la representación binaria a decimal y almacenarla en una variable int. Luego, el problema se convertirá para simplemente encontrar todos los elementos duplicados en la array dada .

Siga los pasos a continuación para resolver este problema:

  • Hacer un recorrido de orden de nivel desde la raíz hasta la hoja
  • Para cada nivel, conviértalo al equivalente decimal y almacene el valor en un mapa en formato {decimal_number, level_number} .
  • Luego, simplemente verifique si hay más de un nivel para una clave decimal. 
  • En caso afirmativo, imprima los niveles como duplicados.
  • Si no existe tal nivel, devuelve una lista vacía.

A continuación se muestra la implementación del enfoque anterior:

C#

// C# program to implement above approach
 
using System;
using System.Collections.Generic;
using System.Linq;
 
// Class containing left and right
// child of current node and key value
public class Node {
    public int data;
    public Node left, right;
    public Node(int item)
    {
        data = item;
        left = right = null;
    }
}
 
public class LevelInfo {
    public int level;
    public int length;
}
 
public class GFG {
 
    // Root of the Binary Tree
    public Node root;
    Dictionary<int, List<LevelInfo> > duplicateMap
        = new Dictionary<int, List<LevelInfo> >();
 
    public virtual List<List<int> >
    printDuplicateLevels(Node root)
    {
        int h = height(root);
        int i;
 
        List<List<int> > dup_levels
            = new List<List<int> >();
 
        // Initialize for the root level
        var zerolevelInfo
            = new LevelInfo() { level = 0,
                                length = 0 };
 
        duplicateMap[root.data]
            = new List<LevelInfo>() { zerolevelInfo };
 
        for (i = 1; i <= h; i++) {
            List<int> currentLevel
                = new List<int>();
            var currentLevelOrder
                = getCurrentLevel(root, i,
                                  currentLevel)
                      .ToList();
 
            int decimalValue = Convert.ToInt32(
                string.Join("", currentLevelOrder), 2);
 
            var currentlevelInfo = new LevelInfo() {
                level = i - 1, length
                               = currentLevelOrder.Count()
            };
 
            if (duplicateMap.ContainsKey(decimalValue)) {
                var dictData
                    = duplicateMap[decimalValue].Where(
                        l => l.length
                            == currentLevelOrder.Count());
                if (dictData.Any()) {
                    List<int> dup_level_curr
                        = new List<int>();
                    dup_level_curr.Add(i - 1);
                    dup_level_curr.Add(
                        dictData.Select(l => l.level)
                            .First());
                    dup_levels.Add(dup_level_curr);
                }
                else {
                    duplicateMap[decimalValue].Add(
                        currentlevelInfo);
                }
            }
            else
                duplicateMap[decimalValue]
                    = new List<LevelInfo>() {
                          currentlevelInfo
                      };
        }
 
        return dup_levels;
    }
 
    // Compute the "height" of a tree
    public virtual int height(Node root)
    {
        if (root == null) {
            return 0;
        }
        else {
 
            // Compute height of each subtree
            int lheight = height(root.left);
            int rheight = height(root.right);
 
            // Use the larger one
            if (lheight > rheight) {
                return (lheight + 1);
            }
            else {
                return (rheight + 1);
            }
        }
    }
 
    // Get nodes at the current level
    public virtual IList<int>
    getCurrentLevel(Node root, int level,
                    List<int> currentLevelOrder)
    {
        if (root == null) {
            return currentLevelOrder;
        }
        if (level == 1) {
            currentLevelOrder.Add(root.data);
        }
        else if (level > 1) {
            getCurrentLevel(root.left, level - 1,
                            currentLevelOrder);
            getCurrentLevel(root.right, level - 1,
                            currentLevelOrder);
        }
        return currentLevelOrder;
    }
 
    // Driver Code
    public static void Main(string[] args)
    {
        GFG tree = new GFG();
        tree.root = new Node(1);
        tree.root.left = new Node(0);
        tree.root.right = new Node(1);
 
        tree.root.left.left = new Node(1);
        tree.root.left.right = new Node(0);
 
        tree.root.right.left = new Node(1);
 
        tree.root.left.right.left = new Node(0);
        tree.root.right.left.right = new Node(1);
 
        tree.root.left.right.left.left = new Node(1);
 
        // Execute and print the duplicate levels
        List<List<int> > dup_levels
            = tree.printDuplicateLevels(tree.root);
 
        Console.Write("[ ");
        foreach(var curr_level in dup_levels)
        {
            Console.Write("[ ");
            foreach(var dupli_level in curr_level)
            {
                Console.Write(dupli_level + " ");
            }
            Console.Write("] ");
        }
        Console.WriteLine("]");
    }
}
Producción

[ [ 3 1 ] [ 4 0 ] ]

Complejidad temporal: O(N)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por crypticj 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 *