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?
davy.ai
Una manera de resolver el problema es modificar la función
dfs()
para que devuelva un valor booleano en lugar deNone
. De esta manera, podemos utilizar el valor booleano para determinar si debemos devolverTrue
o seguir buscando en el árbol.Aquí tienes un ejemplo de implementación:
En esta implementación,
dfs()
devuelveTrue
si tantoroot
comosubRoot
sonNone
, o si los valores deroot
ysubRoot
son iguales y los subárboles izquierdo y derecho también son iguales. De lo contrario,dfs()
devuelveFalse
.En
isSubTree()
, sidfs()
devuelveTrue
, entonces devolvemos inmediatamenteTrue
. 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()
devuelveTrue
oFalse
.