이와 같은 상황에서는 종종 뒤로 생각하는 것이 더 쉬우므로 먼저 필요한 것을 고려하십시오. 설명에서 다음을 나열하십시오.
자, 그것은 상당히 짧은 목록입니다. 이것은 관리 가능해야합니다. 빈 메소드로 시작해 봅시다. 무슨 일이 일어나야하는지 설명하겠습니다.
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.
}
당신이주의를 기울이고 있다면, 그것은 우리의 기능이 무엇을 반환 해야하는지 알려줍니다.
이제 계산을 어떻게 통합합니까? 무엇을 계산할 것인지 ( "왼쪽 및 오른쪽 자식 노드가 모두있는 부모 노드") 실제 코드로 해석하기 어렵지 않아야합니다. 해당 조건이 만족되는지 확인하고 카운터를 적절하게 늘리십시오. 이것이 사실 일 때마다 도달 할 수있는 곳에 있어야한다는 것을 기억하십시오.
물론 재귀 중지 조건과 같은 세부 정보를 생략하고 null을 확인합니다.
<
는 노드에서 어떻게 정의됩니까?