es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo crear un árbol D-ario balanceado en Python utilizando el paquete `networkx` en Python.

Estoy intentando generar un árbol balanceado D-ario en python utilizando el paquete networkx.

import networkx as nx
g = nx.Graph()
D = int(input("Ingrese el número de hijos de un nodo: "))
L = int(input("Ingrese el número de niveles: "))

# variable para almacenar el número total de nodos en el árbol.
tot_node = 0

for i in range(0, L + 1):
  tot_node = tot_node + D ** i

for N in range(1, tot_node):
  for j in range(N, N + D):
    g.add_edge(N, j)

nx.draw(g)

Para esto, obtengo el siguiente árbol para D=2 y L=3.
ver descripción de la imagen aquí

¿Alguien puede señalar el error en este código? Quiero construir un árbol balanceado para cualquier D general (el número de ramas de un nodo).

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El código proporcionado en realidad genera un árbol D-ario completo, no un árbol D-ario balanceado. En un árbol D-ario completo, todos los niveles están completamente llenos, excepto posiblemente el último nivel, que se llena de izquierda a derecha. Sin embargo, un árbol D-ario balanceado es un árbol en el cual para cada nodo, la diferencia en el número de descendientes entre cada rama no es mayor que uno.

    Para generar un árbol D-ario balanceado, puedes modificar el código de la siguiente manera:

    import networkx as nx
    
    def build_balanced_dary_tree(D, L):
        """
        Construye un árbol D-ario balanceado con L niveles utilizando el paquete networkx.
    
        Parámetros:
        D (int): el número de hijos de un nodo.
        L (int): el número de niveles del árbol.
    
        Retorna:
        g (networkx.classes.graph.Graph): el árbol D-ario generado.
    
        """
        g = nx.Graph()
    
        # usa una lista para hacer un seguimiento de los nodos en cada nivel del árbol
        # el nodo raíz está en el nivel 0
        levels = [[1]]
        node_count = 1  # número total de nodos en el árbol
    
        # crea nodos y aristas
        for i in range(1, L+1):
            level = []
            for j in range(D**i):
                node_count += 1
                level.append(node_count)
                g.add_edge((node_count-1)//D + 1, node_count) # nodo padre a nodo hijo
            levels.append(level)
    
        return g
    
    # ejemplo de uso
    D = int(input("Ingrese el número de hijos de un nodo: "))
    L = int(input("Ingrese el número de niveles: "))
    
    g = build_balanced_dary_tree(D, L)
    nx.draw(g)
    

    En este código modificado, usamos una lista llamada levels para hacer un seguimiento de los nodos en cada nivel del árbol. El nodo raíz está en el nivel 0 y es simplemente el nodo 1. Luego iteramos sobre los niveles del árbol, creando nodos y aristas a medida que avanzamos. Para cada nivel, mantenemos una lista de los nodos en ese nivel llamada level. También actualizamos el número total de nodos en el árbol, node_count. Creamos un nodo node_count para cada hijo de cada nodo en el nivel i-1, y agregamos una arista desde el nodo padre al nodo hijo. Utilizamos la división entera // para calcular el nodo padre en función del índice del nodo hijo, que varía de 1 a D^i inclusive. Finalmente, agregamos la lista level a levels para que podamos calcular el número de nodos en el árbol con la expresión sum(len(level) for level in levels).

Comments are closed.