Dans des choses comme celle-ci, il est souvent plus facile de penser à l'envers, alors pensez d'abord à ce dont vous avez besoin. À partir de votre description, listons-les:
- Récursivité
- Validité
- Nombre de nœuds complets
OK, c'est une liste assez courte, cela devrait être gérable. Commençons par une méthode vide et j'ajouterai une description de ce qui devrait se passer.
valid_bst () {
}
Maintenant validité. Comment vérifiez-vous la validité? Dans le chat, vous avez dit qu'un arbre est valide "si ... tous les enfants de gauche sont inférieurs au parent et les enfants de droite sont supérieurs au parent". Je suis sûr que vous vouliez également permettre l'égalité. Ce serait t.left.value <= t.value <= t.right.value
.
valid_bst () {
This node is valid if t.left.value <= t.value <= t.right.value
}
Mais que faire si l'un des enfants est porté disparu? D'après ce que vous avez dit, je pense que vous savez que le nœud est toujours valide s'il en manque un (ou les deux). Ajoutons ceci, restructurant légèrement:
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, nous savons maintenant si ce nœud est valide. Comment vérifions-nous si l’arbre entier est valide? Ce n'est pas dans un tableau, donc nous ne pouvons / ne voulons probablement pas le boucler linéairement. Votre mission donne la réponse: récursivité. Mais comment accumuler une réponse en utilisant la récursivité? Nous avons accès à trois informations, si ce nœud est valide, et le résultat d'appels demandant si les nœuds gauche et droit sont valides. Évidemment, l'arbre n'est valide que si les trois sont vraies.
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 vous faites attention, cela nous dit même ce que notre fonction doit retourner.
Maintenant, comment intégrons-nous le comptage? Vous dites ce qui compte ("un nœud parent avec des nœuds enfants gauche et droit"), et cela ne devrait pas être difficile à traduire en code réel. Vérifiez si cette condition est remplie et incrémentez le compteur de manière appropriée. N'oubliez pas que cela doit être quelque part où il sera atteint chaque fois que cela sera vrai.
Et bien sûr, j'ai omis certains détails comme la condition d'arrêt de récursivité et vérifie la valeur null.
<
défini sur les nœuds?