В таких вещах часто легче думать задом наперед, поэтому сначала подумайте, что вам нужно. Из вашего описания, давайте перечислим их:
- Рекурсия
- Период действия
- Количество полных узлов
Хорошо, это довольно короткий список, это должно быть управляемым. Давайте начнем с пустого метода, и я добавлю описание того, что должно происходить.
valid_bst () {
}
Теперь действительность. Как вы проверяете действительность? В чате вы сказали, что дерево действительно, «если ... все левые дети меньше, чем родитель, а правые дети больше, чем родитель». Я уверен, что вы хотели разрешить равенство. Это было бы t.left.value <= t.value <= t.right.value
.
valid_bst () {
This node is valid if t.left.value <= t.value <= t.right.value
}
Но что, если один из детей пропал? Из того, что вы сказали, я думаю, вы знаете, что узел все еще действителен, если один из них (или оба отсутствуют). Давайте добавим это, немного перестроив:
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.
}
Хорошо, теперь мы знаем, действителен ли этот узел. Как мы можем проверить, является ли все дерево действительным? Он не находится в массиве, поэтому мы, вероятно, не можем / не хотим циклически проходить по нему. Ваше задание дает ответ: рекурсия. Но как мы накапливаем ответ, используя рекурсию? У нас есть доступ к трем частям информации, является ли этот узел действительным, и результат вызовов, спрашивающих, действительны ли левый и правый узлы. Очевидно, дерево действительно только в том случае, если все три из них верны.
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.
}
Если вы обращаете внимание, это даже говорит нам, что наша функция должна вернуть.
Теперь, как мы интегрируем подсчет? Вы говорите, что имеет значение («родительский узел с левыми и правыми дочерними узлами»), и это не должно быть трудно перевести в реальный код. Проверьте, выполняется ли это условие, и увеличьте счетчик соответствующим образом. Просто помните, что это должно быть где-то, где это будет достигаться каждый раз, когда это правда.
И, конечно, я пропустил некоторые детали, такие как условие остановки рекурсии и проверки на ноль.
<
определяется оператор сравнения на узлах?