Dalam hal-hal seperti ini, seringkali lebih mudah untuk berpikir mundur, jadi pertimbangkan dulu apa yang Anda butuhkan. Dari deskripsi Anda, mari daftarkan mereka:
- Pengulangan
- Keabsahan
- Hitungan node lengkap
OK, itu daftar yang cukup singkat, ini harus dapat dikelola. Mari kita mulai dengan metode kosong dan saya akan menambahkan deskripsi tentang apa yang seharusnya terjadi.
valid_bst () {
}
Sekarang validitas. Bagaimana Anda memeriksa validitas? Dalam obrolan Anda mengatakan pohon itu valid "jika ... semua anak yang tersisa lebih kecil dari orang tua, dan anak yang tepat lebih besar dari orang tua." Saya yakin Anda bermaksud untuk mengizinkan kesetaraan juga. Itu pasti t.left.value <= t.value <= t.right.value
.
valid_bst () {
This node is valid if t.left.value <= t.value <= t.right.value
}
Tetapi bagaimana jika salah satu dari anak-anak itu hilang? Dari apa yang Anda katakan, saya yakin Anda tahu simpul masih valid jika salah satu (atau keduanya) hilang. Mari kita tambahkan ini, restrukturisasi sedikit:
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, kita sekarang tahu apakah simpul ini valid. Bagaimana kita memeriksa apakah seluruh pohon itu valid? Itu tidak ada dalam array, jadi kita mungkin tidak bisa / tidak ingin mengulanginya secara linear. Tugas Anda memberikan jawabannya: rekursi. Tetapi bagaimana kita mengumpulkan jawaban menggunakan rekursi? Kami memiliki akses ke tiga informasi, apakah simpul ini valid, dan hasil panggilan yang menanyakan apakah simpul kiri dan kanan itu valid. Jelas pohon itu hanya valid jika ketiganya benar.
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.
}
Jika Anda memperhatikan, itu bahkan memberi tahu kami apa yang harus dikembalikan oleh fungsi kami.
Sekarang, bagaimana kita mengintegrasikan penghitungan? Anda mengatakan apa yang diperhitungkan ("simpul orangtua dengan simpul anak kiri dan kanan"), dan itu seharusnya tidak sulit untuk diterjemahkan ke dalam kode aktual. Periksa apakah kondisi itu terpenuhi dan tambahkan penghitung dengan tepat. Ingat saja ini harus di suatu tempat di mana ia akan tercapai setiap kali itu benar.
Dan tentu saja saya telah meninggalkan beberapa detail seperti kondisi berhenti rekursi dan memeriksa nol.
<
didefinisikan pada node?