¿Es este un algoritmo correcto para verificar si un árbol es una búsqueda binaria?

Hay un par de problemas en este enfoque de validación de la estructura BST.

  1. 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.
  2. El segundo problema está un poco relacionado con la rutina recursiva. Tomemos por ejemplo la siguiente estructura

5 5

3 8

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))

}

Supongo que desea verificar las BST que darían un orden creciente de valores cuando realiza un recorrido en orden.

No, no es correcto; falla para un caso de prueba simple cuando el árbol es un BST:

Nodo raíz = 5
Raíz-> Izquierda = 4
Raíz-> Derecha = 6

Si tenía la intención de escribir (t.right

Nodo raíz = 5
Raíz -> Izquierda = 6
Raíz-> Derecha = 8

Debes asegurarte de que

(valor (T.right)> valor (T)) AND (valor (T)> valor (T.left))