Berbagi teknologi

Catatan Struktur Data: Threading Pohon Biner

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Pohon biner adalah struktur data penting yang terdiri dari node, setiap node memiliki paling banyak dua node anak. Dalam beberapa kasus, kita perlu melintasi pohon biner untuk mengunjungi semua nodenya. Namun, pada pohon biner yang tidak seimbang, metode traversal biasa dapat menyebabkan inefisiensi. Untuk mengatasi masalah ini, kita bisa menggunakan teknik yang disebut "threading" untuk mengoptimalkan proses traversal.

1. Apa yang dimaksud dengan threading pohon biner?

Threading pohon biner mengacu pada proses mengubah pohon biner menjadi pohon biner berulir. Pohon biner petunjuk menambahkan dua pointer ke pohon biner asli: ltag dan rtag, yang masing-masing menunjuk ke pendahulu dan penerus dari anak kiri dan anak kanan. Hal ini memungkinkan traversal in-order, pre-order, dan post-order dengan mudah.

2. Bagaimana cara mengimplementasikan threading pohon biner?

  1. Threading urutan tengah

Threading in-order dicapai dengan mengubah algoritma traversal in-order. Ketika sebuah node diakses, kita menghubungkan informasi petunjuk antara node tersebut dengan node pendahulunya. Langkah-langkah spesifiknya adalah sebagai berikut:

  • Inisialisasi sebuah pointer pre, digunakan untuk mencatat node pendahulu dari node yang sedang dikunjungi.
  • Lintasi setiap node dalam pohon biner, untuk setiap node:
    • Jika ini adalah node pertama yang dikunjungi, lchild-nya disetel ke pre dan ltag disetel ke 1.
    • Jika node pendahulunya telah ditentukan (yaitu, pre tidak kosong), rchild-nya disetel ke pre dan rtag disetel ke 1.
    • Perbarui pra ke node saat ini.
  1. isyarat praorder

Ide dari petunjuk pre-order dan petunjuk mid-order serupa, namun Anda perlu memperhatikan masalah lingkaran sihir tetesan cinta. Ketika ltag=0, subpohon kiri dapat diberi petunjuk dalam praorder. Langkah-langkah spesifiknya adalah sebagai berikut:

  • Inisialisasi sebuah pointer pre, digunakan untuk mencatat node pendahulu dari node yang sedang dikunjungi.
  • Lintasi setiap node dalam pohon biner, untuk setiap node:
    • Jika ini adalah node pertama yang dikunjungi, lchild-nya disetel ke pre dan ltag disetel ke 1.
    • Jika node pendahulunya telah ditentukan (yaitu, pre tidak kosong), rchild-nya disetel ke pre dan rtag disetel ke 1.
    • Perbarui pra ke node saat ini.
    • Jika ltag=0, threading preorder dilakukan pada subpohon kiri secara rekursif.
  1. Petunjuk pasca pesanan

Threading postorder juga mengikuti ide serupa, namun perhatian khusus perlu diberikan saat memproses rchild dan rtag dari node terakhir. Langkah-langkah spesifiknya adalah sebagai berikut:

  • Inisialisasi sebuah pointer pre, digunakan untuk mencatat node pendahulu dari node yang sedang dikunjungi.
  • Lintasi setiap node dalam pohon biner, untuk setiap node:
    • Jika ini adalah node pertama yang dikunjungi, lchild-nya disetel ke pre dan ltag disetel ke 1.
    • Jika node pendahulunya telah ditentukan (yaitu, pre tidak kosong), rchild-nya disetel ke pre dan rtag disetel ke 1.
    • Perbarui pra ke node saat ini.
    • Ketika node terakhir ditemukan, rchild-nya disetel ke pre dan rtag disetel ke 1.

3. Titik rawan kesalahan

Dalam proses penerapan threading pohon biner, berikut adalah beberapa titik rawan kesalahan yang umum terjadi:

  1. Perlakuan khusus terhadap rchild dan rtag dari node terakhir diabaikan.
  2. Pada saat proses pre-order threading, masalah lingkaran sihir tetesan cinta tidak tertangani dengan baik.
  3. Pra penunjuk tidak diinisialisasi atau diperbarui dengan benar.

4. Ringkasan

Threading pohon biner adalah metode yang efektif untuk mengoptimalkan strategi traversal. Dengan menambahkan pointer tambahan dan memodifikasi algoritma traversal, kita dapat mengakses semua node di pohon biner dengan lebih efisien. Dalam penerapan praktis, kita harus memperhatikan untuk menghindari beberapa kesalahan umum yang disebutkan di atas untuk memastikan kebenaran dan stabilitas kode.