El siguiente es un desafío de codificación en el que estoy trabajando.
Se le proporciona un árbol binario en el que cada nodo contiene un valor. Diseñe un algoritmo para imprimir todos los nodos cuyo subárbol sume un número par.
Este es el árbol con el que estoy trabajando para probar, junto con mi función:
class Node { constructor(val) { this.val = val; this.left = null; this.right = null; } } const a = new Node(3); const b = new Node(11); const c = new Node(4); const d = new Node(4); const e = new Node(-2); const f = new Node(2); a.left = b; a.right = c; b.left = d; b.right = e; c.right = f; // 3 // / \ // 11 4 // / \ \ // 4 -2 2 const isEven = (node) => { if (node === null) return 0; let left = isEven(node.left); let right = isEven(node.right); let sum = left + right + node.val; if (sum % 2 === 0) { console.log(node.val); } return; }; console.log(isEven(a));La función no funciona como yo quiero.
Dado este árbol, creo que la salida correcta debería ser: 3, 4, -2, 4, también conocido como a, d, e y c. (suponiendo nulo = 0) Pero el resultado que obtengo es: 4, -2, 2, indefinido
No estoy seguro de dónde viene el 2 porque ningún nodo es igual a 2. (Eso fue un error de mi parte)
Puede hacer que la función devuelva la suma del subárbol. Luego, agregue el resultado de llamar a la función para los hijos izquierdo y derecho y el valor del nodo mismo para obtener la suma del subárbol enraizado en este nodo.
class Node { constructor(val) { this.val = val; this.left = null; this.right = null; } } const a = new Node(3); const b = new Node(11); const c = new Node(4); const d = new Node(4); const e = new Node(-2); const f = new Node(2); a.left = b; a.right = c; b.left = d; b.right = e; c.right = f; const checkEven = node => { if(!node) return 0; const sum = node.val + checkEven(node.left) + checkEven(node.right); if(sum % 2 === 0) console.log(node.val); return sum; } checkEven(a);el resultado que obtengo es: 4, -2, 2, indefinido.
La razón por la que no está undefined al final es que hace un console.log de la llamada principal isEven , pero su función isEven no devuelve nada: su última instrucción es return , por lo que el console.log principal genera undefined . En realidad, no debe realizar un console.log en su programa principal, ya que la impresión de nodos ya se ha realizado en su función.
No estoy seguro de dónde viene el 2 porque ningún nodo es igual a 2.
El nodo f tiene un valor de 2 y debería estar en la salida.
Creo que la salida correcta debería ser: 3, 4, -2, 4 también conocido como a, d, e y c. (asumiendo nulo = 0)
... y f
No está obteniendo todos los resultados, porque isEven solo puede devolver null o undefined , por lo que left + right no dará lo que espera: agregar null a un número tratará ese null como 0, pero cuando se trata de undefined , la expresión evaluará a NaN .
Esto se soluciona cambiando la return final por la return sum .
Aquí está su script corregido con esas dos correcciones:
class Node { constructor(val) { this.val = val; this.left = null; this.right = null; } } const a = new Node(3); const b = new Node(11); const c = new Node(4); const d = new Node(4); const e = new Node(-2); const f = new Node(2); a.left = b; a.right = c; b.left = d; b.right = e; c.right = f; // 3 // / \ // 11 4 // / \ \ // 4 -2 2 const isEven = (node) => { if (node === null) return 0; let left = isEven(node.left); let right = isEven(node.right); let sum = left + right + node.val; if (sum % 2 === 0) { console.log(node.val); } return sum; // <-- sum! }; isEven(a); // <-- no console.log No está relacionado con su pregunta, pero puede hacer que su constructor de nodos sea un poco más flexible definiendo parámetros para especificar referencias left y right . Luego puede construir el árbol en una expresión anidada.
class Node { constructor(val, left=null, right=null) { // <-- extra parameters this.val = val; this.left = left; this.right = right; } } const a = new Node(3, new Node(11, new Node(4), new Node(-2) ), new Node(4, null, new Node(2) ) ); const isEven = (node) => { if (node === null) return 0; let left = isEven(node.left); let right = isEven(node.right); let sum = left + right + node.val; if (sum % 2 === 0) { console.log(node.val); } return sum; }; isEven(a);