У таких речах часто простіше думати назад, тому спочатку подумайте, що вам потрібно. З вашого опису перерахуємо їх:
- Рекурсія
- Дійсність
- Кількість повних вузлів
Гаразд, це досить короткий список, це має бути керованим. Почнемо з порожнього методу, і я додам опис того, що має відбуватися.
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.
}
Якщо ви звертаєте увагу, це навіть говорить нам, яку функцію потрібно повернути.
Тепер, як ми інтегруємо підрахунок? Ви кажете, що рахується ("батьківський вузол з лівими та правими дочірніми вузлами"), і це не повинно бути важко перевести в фактичний код. Перевірте, чи виконується ця умова і належним чином збільшуйте лічильник. Просто пам’ятайте, що це повинно бути десь там, де це буде досягнуто кожен раз, коли це правда.
І звичайно, я залишив деякі деталі, такі як стан зупинки рекурсії та перевірка на нуль.
<
визначається оператор порівняння на вузлах?