Ini bisa diselesaikan dengan cara yang lebih baik. Juga, kita dapat mengurangi kompleksitas waktu menjadi O (n) dengan sedikit modifikasi dalam struktur data dan menggunakan pendekatan berulang. Untuk analisis terperinci dan berbagai cara untuk menyelesaikan masalah ini dengan berbagai struktur data.
Berikut ringkasan dari apa yang ingin saya jelaskan di posting blog saya :
Pendekatan Rekursif - Diameter Pohon
Cara lain untuk mendekati masalah ini adalah sebagai berikut. Seperti yang kami sebutkan di atas bahwa diameter bisa
- sepenuhnya terletak di sub pohon kiri atau
- sepenuhnya terletak di sub pohon kanan atau
- dapat span melintasi root
Yang berarti bahwa diameternya dapat diturunkan secara ideal
- diameter pohon kiri atau
- diameter pohon kanan atau
- ketinggian sub pohon kiri + tinggi sub pohon kanan + 1 (1 untuk menambahkan simpul akar ketika diameter membentang melintasi simpul akar)
Dan kita tahu bahwa diameternya adalah jalur terpanjang, jadi kita mengambil maksimum 1 dan 2 kalau-kalau itu terletak di salah satu sisi atau wee ambil 3 jika membentang melalui root.
Pendekatan berulang - Diameter Pohon
Kami memiliki pohon, kami membutuhkan informasi meta dengan masing-masing simpul sehingga setiap simpul tahu berikut:
- Ketinggian anak kirinya,
- Tinggi anak kanannya dan
- Jarak terjauh antara simpul daunnya.
Setelah setiap node memiliki informasi ini, kita memerlukan variabel sementara untuk melacak jalur maksimum. Pada saat algoritma selesai, kami memiliki nilai diameter dalam variabel temp.
Sekarang, kita perlu menyelesaikan masalah ini dengan pendekatan bottom-up, karena kita tidak tahu tentang tiga nilai untuk root. Tetapi kita tahu nilai-nilai ini untuk daun.
Langkah-langkah untuk dipecahkan
- Inisialisasi semua daun dengan Tinggi kiri dan Tinggi kanan sebagai 1.
- Inisialisasi semua daun dengan maxDistance sebagai 0, kami menyatakan bahwa jika salah satu dari leftHeight atau rightHeight adalah 1, kita membuat maxDistance = 0
- Bergerak ke atas satu per satu dan menghitung nilai untuk induk langsung. Akan mudah karena sekarang kita tahu nilai-nilai ini untuk anak-anak.
Pada titik tertentu,
- tetapkan leftHeight sebagai maksimum (leftHeight atau rightHeight dari anak kirinya).
- tetapkan rightHeight sebagai maksimum (leftHeight atau rightHeight anak kanannya).
- jika salah satu dari nilai-nilai ini (leftHeight atau rightHeight) adalah 1 menjadikan maxDistance sebagai nol.
- jika kedua nilai lebih besar dari nol, buat maxDistance sebagai leftHeight + rightHeight - 1
- Pertahankan maxDistance dalam variabel temp dan jika pada langkah 4 maxDistance lebih dari nilai saat ini dari variabel, ganti dengan nilai maxDistance baru.
- Pada akhir algoritma, nilai dalam maxDistance adalah diameter.