Tengo una función de ayuda que primero itera a través de un árbol de búsqueda binario e inserta cada 'nivel' del árbol binario en un subarreglo, que luego se inserta en un arreglo 2d.
Por ejemplo:
// a // / \ // bc // / \ \ // defSe ve como esto:
// [ // ['a'], // ['b', 'c'], // ['d', 'e', 'f'] // ]Aquí está mi función auxiliar:
const myLevels = (root) => { const subLevels = []; const queue = [{ node: root, currentLevel: 0, }]; while (queue.length > 0) { let { node, currentLevel } = queue.shift(); if (subLevels.length === currentLevel) { subLevels.push([node.val]); } else { subLevels[currentLevel].push(node.val); }; if (node.left !== null) queue.push({ node: node.left, currentLevel: currentLevel + 1 }); if (node.right !== null) queue.push({ node: node.right, currentLevel: currentLevel + 1 }); }; return subLevels; };Esto funciona, sin embargo, quiero usar la función auxiliar en otra función que devolverá un elemento específico de cada nivel que devuelve la función auxiliar. Por ejemplo, ¿qué pasaría si quisiera devolver los elementos más a la izquierda y más a la derecha de cada nivel? ¿O si quisiera encontrar el segundo valor más grande en cada nivel (asumiendo que cada valor de nodo consiste en un número), o si quisiera devolver las vocales de cada nivel?
Mi enfoque actual es iterar a través de cada subarreglo de la matriz 2d y luego iterar a través de esos elementos, ya que este enfoque tiene más sentido para mí. Sin embargo, no tengo idea de cómo conceptualizar el seguimiento de cada nivel y decirle a mi función que "mire este subarreglo como si fuera un arreglo completamente nuevo".
Esta es mi función principal hasta ahora:
function findXEachLevel(root) { const levels = myLevels(root); let finalArray = []; for (let i = 0; i < levels.length; i++) { let currentLevel = levels[i]; console.log(currentLevel) // Shows the current subarray in the 2d array for (let j = 0; j < currentLevel.length; j++) { let currentValue = currentLevel[j]; console.log(currentValue) // Shows the current value in the subarray }; }; };¿Sería una devolución de llamada una solución viable aquí, o existe un enfoque más simple?