Trong những điều như thế này, thường dễ nghĩ ngược hơn, vì vậy trước tiên hãy xem xét những gì bạn cần. Từ mô tả của bạn, hãy liệt kê chúng:
- Đệ quy
- Hiệu lực
- Đếm các nút hoàn chỉnh
OK, đó là một danh sách khá ngắn, điều này nên được quản lý. Hãy bắt đầu với một phương thức trống và tôi sẽ thêm mô tả về những gì sẽ xảy ra.
valid_bst () {
}
Bây giờ hiệu lực. Làm thế nào để bạn kiểm tra tính hợp lệ? Trong trò chuyện, bạn nói rằng một cái cây là hợp lệ "nếu ... tất cả trẻ em bên trái đều nhỏ hơn cha mẹ và trẻ em bên phải lớn hơn cha mẹ". Tôi chắc chắn rằng bạn có nghĩa là cho phép bình đẳng là tốt. Đó sẽ là t.left.value <= t.value <= t.right.value
.
valid_bst () {
This node is valid if t.left.value <= t.value <= t.right.value
}
Nhưng nếu một trong những đứa trẻ bị mất thì sao? Từ những gì bạn đã nói, tôi tin rằng bạn biết nút vẫn còn hiệu lực nếu thiếu (hoặc cả hai). Hãy thêm điều này, tái cấu trúc một chút:
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, bây giờ chúng ta biết liệu nút này có hợp lệ không. Làm thế nào để chúng ta kiểm tra xem toàn bộ cây có hợp lệ không? Nó không nằm trong một mảng, vì vậy có lẽ chúng ta không thể / không muốn lặp lại nó một cách tuyến tính. Bài tập của bạn đưa ra câu trả lời: đệ quy. Nhưng làm thế nào để chúng ta tích lũy một câu trả lời bằng cách sử dụng đệ quy? Chúng tôi có quyền truy cập vào ba mẩu thông tin, cho dù nút này có hợp lệ hay không và kết quả của các cuộc gọi hỏi xem các nút trái và phải có hợp lệ hay không. Rõ ràng cây chỉ có giá trị nếu cả ba điều đó đều đúng.
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.
}
Nếu bạn đang chú ý, điều đó thậm chí còn cho chúng ta biết chức năng của chúng ta cần trả về.
Bây giờ, làm thế nào để chúng ta tích hợp đếm? Bạn nói những gì được tính ("một nút cha có cả hai nút con trái và phải") và điều đó không khó để dịch thành mã thực tế. Kiểm tra xem điều kiện đó có được thỏa mãn hay không và tăng bộ đếm một cách thích hợp. Chỉ cần nhớ điều này phải ở một nơi nào đó sẽ đạt được mỗi khi nó là sự thật.
Và tất nhiên tôi đã bỏ qua một số chi tiết như điều kiện dừng đệ quy và kiểm tra null.
<
được xác định trên các nút?