Hay un par de problemas en este enfoque de validación de la estructura BST.
- Como ya se señaló en otra respuesta, el check node.left <node.right es insuficiente, porque necesita incluir el nodo actual en la comparación. En otras palabras, node.left <node <node.right.
- El segundo problema está un poco relacionado con la rutina recursiva. Tomemos por ejemplo la siguiente estructura
5 5
3 8
- ¿Cuáles son los algoritmos de detección de spam social de última generación?
- Cómo desarrollarme bien en algoritmos y programación
- ¿Qué sucede cuando hay un ciclo negativo en el gráfico?
- ¿Qué algoritmo es el más adecuado para la detección de fraudes en términos de precisión y consistencia en la minería de datos?
- Si un gráfico G contiene un puente, e, ¿es posible construir un árbol de expansión que no incluya este borde?
1 6 2 9
El árbol de arriba pasará las verificaciones de su código, porque cada nodo satisface la relación de desigualdad mencionada en el paso 1. Pero si ve el nodo (3), el nodo derecho (6) no es válido porque el nodo (5) o la raíz , termina teniendo un nodo mayor que él a su izquierda.
3. Por lo tanto, para resolver completamente este problema, deberá realizar un seguimiento de los valores mínimos y máximos mientras va en cada dirección. Es decir, cuando va a la izquierda del nodo (5), necesita hacer max_allowed a 5, y mientras va a la derecha del nodo (5), use un min_allowed de 5.
Aquí está la función para eso:
public boolean isBST (nodo TreeNode) {
return isBST (nodo, nulo, nulo);
}
isBST privado booleano (nodo TreeNode, Integer min, Integer max) {
if (nodo == nulo) devuelve verdadero;
if (min! = null && node.val <min) devuelve falso;
if (max! = null && node.val> max) devuelve falso;
return (isBST (node.left, min, node.val) && isBST (node.right, node.val, max))
}