¿Cómo podemos encontrar el árbol de búsqueda binario más grande en un árbol binario de manera eficiente?

Aquí está la solución O (n): Encuentre el tamaño del BST más grande en un árbol binario

La idea básica para encontrar el BST más grande en un árbol binario es que para que un árbol con root como currentNode sea un BST válido, sus subárboles izquierdo y derecho deben ser BST válidos, el valor de currentNode debe ser mayor que el valor máximo El nodo de su subárbol izquierdo y el valor de currentNode tiene que ser menor que el nodo de valor mínimo de su subárbol derecho

Para verificar estas condiciones, devolvemos el valor del nodo de valor máximo, el nodo de valor mínimo y la variable booleana que indica si el árbol es BST válido o no de cada subárbol. También devolvemos el tamaño de un subárbol si es un BST válido o devolvemos -1 si no es un BST válido. Usando estas variables devueltas de los subárboles izquierdo y derecho, podemos verificar en el CurrentNode si el árbol con su raíz como currentNode es un BST válido o no. Si el árbol es un BST válido, calculamos el tamaño del árbol usando (1 + sizeOfLeftSubtree + sizeOfRightSubtree) y lo devolvemos junto con otras variables mencionadas anteriormente. Si no es un BST válido, devolvemos -1 junto con otras variables.

El siguiente diagrama ilustra los valores devueltos de cada subárbol.

Espero que esto ayude.

Puede resolver este problema en tiempo O (N). Para comprender el algoritmo, primero echemos un vistazo a la resolución de este problema donde el BST debe contener la raíz.

Si la raíz debe estar contenida en el BST, entonces si el hijo izquierdo es menor, entonces la raíz deberíamos incluir el hijo izquierdo. Esto se debe a que lo que hacemos a la izquierda de la raíz no puede afectar la derecha de la raíz y viceversa, y de lo contrario terminamos el subárbol. Por lo tanto, es perjudicial no tener un hijo izquierdo / derecho cuando es posible.

Este mismo argumento general se aplica a medida que recurres hacia abajo en el árbol y obtienes restricciones sobre el rango en el que debe estar el nodo del árbol si puedes agregarlo.

Aquí hay un boceto de un algoritmo donde se debe incluir la raíz:

  int resolver (nodo, min_possible, max_possible) {
   if (node! = NULL && min_possible <= node.value && node.value <= max_possible) {
     return 1 + resolver (node.left, min_possible, node.value) + resolver (node.right, node.value, max_possible)
   }
 } 

Este algoritmo se ejecuta en tiempo O (N). Sin embargo, es posible que su árbol de búsqueda no esté enraizado en la raíz de su BST, por lo que deberá hacer O (N ^ 2) de estas búsquedas. Sin embargo, esto se reduce a O (N) utilizando la memorización. Esto se debe a que para un nodo dado solo pueden ocurrir 3 estados posibles de (min_possible, max_possible). Por ejemplo, si el nodo actual es un elemento secundario izquierdo con padre p, los estados son: {(-INF, + INF), (-INF, p.value), (g.value, p.value)} donde g es el antepasado más reciente del que somos el subárbol opuesto de nuestro padre.

Esta publicación a continuación explica tanto O (n ^ 2) como O (n) de manera eficiente
Encuentra el subárbol BST más grande en un árbol binario dado – GeeksforGeeks

More Interesting

La relación entre un montón binomial con n elementos y la representación binaria de n, es que cada uno de los árboles en el montón binomial corresponde a un dígito en la representación binaria del número total de nodos utilizados para crear el montón binomial. ¿Es esta relación una mera coincidencia?

¿Podría practicar para una entrevista de codificación descifrando la entrevista de codificación para intermediarios?

¿Qué debo esperar en la entrevista técnica para .NET en Skype de Microsoft Redmond?

¿Cuáles son algunos consejos para practicar la codificación en documentos de Google para una pantalla de teléfono?

¿Cómo se puede mejorar dando entrevistas de programación cuando las compañías no dan retroalimentación cuando rechazan a un candidato?

¿Cómo debo prepararme para una entrevista en Python?

Sigo fallando las entrevistas de programación para pasantías de ingeniería de software. ¿Qué tengo que hacer?

¿Cuáles son las preguntas más básicas de Java formuladas en una entrevista?

¿Cuáles son algunos proyectos que se pueden hacer para mejorar mi cartera de proyectos junto con mi currículum?

¿Qué sitios web son buenos para prepararse para las entrevistas de Software QA?

¿Cómo podemos encontrar el árbol de búsqueda binario más grande en un árbol binario de manera eficiente?

¿Bash es una buena idea para una entrevista de programación de alta tecnología?

¿Cómo corrijo un error que cometió mi entrevistador en una entrevista telefónica con Google?

Una pequeña empresa me ha pedido que escriba un fragmento de su nueva API como un desafío de codificación y lo envíe a una sucursal privada para su revisión. ¿Debería hacerlo?

¿Cuáles son las buenas preguntas de la entrevista técnica de Google?