Em coisas como essa, geralmente é mais fácil pensar de trás para a frente, então primeiro considere o que você precisa. Na sua descrição, vamos listá-los:
- Recursão
- Validade
- Contagem de nós completos
OK, é uma lista bastante curta, deve ser gerenciável. Vamos começar com um método vazio e adicionarei uma descrição do que deveria estar acontecendo.
valid_bst () {
}
Agora validade. Como você verifica a validade? No bate-papo, você disse que uma árvore é válida "se ... todos os filhos esquerdos forem menores que os pais e os filhos direitos forem maiores que os pais". Tenho certeza que você pretendia permitir a igualdade também. Isso seria t.left.value <= t.value <= t.right.value
.
valid_bst () {
This node is valid if t.left.value <= t.value <= t.right.value
}
Mas e se uma das crianças estiver desaparecida? Pelo que você disse, acredito que você sabe que o nó ainda é válido se estiver faltando um (ou ambos). Vamos adicionar isso, reestruturando um pouco:
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.
}
OK, agora sabemos se este nó é válido. Como verificamos se a árvore inteira é válida? Como não está em um array, provavelmente não podemos / não queremos fazer um loop linear sobre ele. Sua tarefa fornece a resposta: recursão. Mas como acumulamos uma resposta usando recursão? Temos acesso a três informações, se esse nó é válido, e o resultado de chamadas perguntando se os nós esquerdo e direito são válidos. Obviamente, a árvore só é válida se todas as três forem verdadeiras.
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.
}
Se você está prestando atenção, isso nos diz até o que nossa função precisa retornar.
Agora, como integramos a contagem? Você diz o que conta ("um nó pai com nós filhos esquerdo e direito"), e isso não deve ser difícil de traduzir em código real. Verifique se essa condição é satisfeita e aumente o contador adequadamente. Lembre-se de que isso deve estar em algum lugar onde será alcançado toda vez que for verdade.
E, é claro, deixei de fora alguns detalhes, como a condição de parada da recursão e verifica se há nulo.
<
definido nos nós?