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.

Pregunta acerca de cómo devolver el resultado correcto de una función recursiva (Leetcode 572)

Estoy resolviendo la pregunta de Leet Code 572 “Subtree of Another Tree”:

Dado los nodos raíces de dos árboles binarios “root” y “subRoot”, retorna “true” si hay un subárbol en “root” con la misma estructura y valores de nodo que “subRoot”, y “false” en caso contrario.

Un subárbol de un árbol binario “tree” es un árbol que consiste en un nodo en “tree” y todos los descendientes de este nodo. El árbol “tree” también podría considerarse un subárbol de sí mismo.

Tenía una solución funcional. Sin embargo, al intentar un enfoque ligeramente diferente, me encontré con un problema en mi función recursiva dfs. La estructura de mi código es la siguiente:

def isSubTree(self, root, subRoot):
    def dfs(root, subRoot):
        # alguna función que retorna True cuando se cumplen ciertas condiciones

if not root: return 

self.isSubtree(root.left, subRoot)
self.isSubtree(root.right, subRoot)

if root.val == subRoot.val:
    if dfs(root, subRoot):
        return True
return False

Básicamente, isSubTree explora todos los nodos del árbol. Una vez que encuentra un nodo con el mismo valor que subRoot, compara el subárbol enraizado en ese nodo con el subárbol enraizado en subRoot mediante dfs().

Mi intención era que cuando la función dfs() retorna true, isSubTree() también retorne true. Si he explorado todos los nodos del árbol (isSubTree() llega al final) y dfs() no ha retornado true en ningún momento, isSubTree() retornará False.

Sin embargo, mi código siempre retorna false, aparentemente debido a la última línea donde retorna False (lo he probado y puedo verificar que la parte de return True en if dfs() fue alcanzada, además estoy bastante seguro de que mi función dfs() es correcta).

Mi pregunta es, ¿hay alguna forma elegante de lograr que mi código haga lo que quiero que haga?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una manera de resolver el problema es modificar la función dfs() para que devuelva un valor booleano en lugar de None. De esta manera, podemos utilizar el valor booleano para determinar si debemos devolver True o seguir buscando en el árbol.

    Aquí tienes un ejemplo de implementación:

    def isSubTree(self, root, subRoot):
        def dfs(root, subRoot):
            if not root and not subRoot: 
                return True
            if (not root and subRoot) or (root and not subRoot) or root.val != subRoot.val: 
                return False
            return dfs(root.left, subRoot.left) and dfs(root.right, subRoot.right)
    
        if not root: 
            return False
    
        if dfs(root, subRoot): 
            return True
        return self.isSubtree(root.left, subRoot) or self.isSubtree(root.right, subRoot)
    

    En esta implementación, dfs() devuelve True si tanto root como subRoot son None, o si los valores de root y subRoot son iguales y los subárboles izquierdo y derecho también son iguales. De lo contrario, dfs() devuelve False.

    En isSubTree(), si dfs() devuelve True, entonces devolvemos inmediatamente True. De lo contrario, buscamos de forma recursiva en los subárboles izquierdo y derecho para encontrar una coincidencia.

    Esta implementación debería manejar correctamente los casos en los que dfs() devuelve True o False.

Comments are closed.