En cosas como esta, a menudo es más fácil pensar hacia atrás, así que primero considera lo que necesitas. De su descripción, enumeremoslos:
- Recursividad
- Validez
- Conteo de nodos completos
OK, esa es una lista bastante corta, esto debería ser manejable. Comencemos con un método vacío y agregaré una descripción de lo que debería estar sucediendo.
valid_bst () {
}
Ahora validez. ¿Cómo se verifica la validez? En el chat dijiste que un árbol es válido "si ... todos los niños restantes son menores que los padres, y los hijos correctos son mayores que los padres". Estoy seguro de que querías permitir la igualdad también. Eso seria t.left.value <= t.value <= t.right.value
.
valid_bst () {
This node is valid if t.left.value <= t.value <= t.right.value
}
¿Pero qué pasa si falta uno de los niños? Por lo que ha dicho, creo que sabe que el nodo todavía es válido si falta uno (o ambos). Agreguemos esto, reestructurando ligeramente:
valid_bst () {
This node is valid to the left if
there is no left child or
it is no greater than the current node.
This node is valid to the right if
there is no right child or
it is no less than the current node.
This node is valid overall if it is valid to the left and right.
}
Bien, ahora sabemos si este nodo es válido. ¿Cómo verificamos si todo el árbol es válido? No está en una matriz, por lo que probablemente no podemos / no queremos recorrerlo linealmente. Su tarea da la respuesta: recursividad. Pero, ¿cómo acumulamos una respuesta usando la recursividad? Tenemos acceso a tres piezas de información, si este nodo es válido y el resultado de las llamadas que preguntan si los nodos izquierdo y derecho son válidos. Obviamente, el árbol solo es válido si los tres son verdaderos.
valid_bst () {
This node is valid to the left if
there is no left child or
it is no greater than the current node.
This node is valid to the right if
there is no right child or
it is no less than the current node.
This node is valid overall if it is valid to the left and right.
Is the left child valid?
Is the right child valid?
This tree is only valid if this node and both its children are.
}
Si está prestando atención, eso incluso nos dice qué debe devolver nuestra función.
Ahora, ¿cómo integramos el conteo? Usted dice lo que cuenta ("un nodo primario con nodos secundarios izquierdo y derecho"), y eso no debería ser difícil de traducir al código real. Compruebe si se cumple esa condición e incremente el contador de forma adecuada. Solo recuerde que esto tiene que estar en algún lugar donde se alcance cada vez que sea cierto.
Y, por supuesto, he omitido algunos detalles, como la condición de detención de recursión y las comprobaciones de nulo.
<
define el operador de comparación en los nodos?