Struktur Bercabang · Pelajaran 7 dari 10

Tree dan binary search tree

11 menit baca · BelajarCode

Tree (pohon) adalah struktur bercabang: satu simpul akar (root) di puncak, setiap simpul punya anak, dan simpul tanpa anak disebut daun (leaf). Struktur folder di komputer dan silsilah keluarga adalah contoh tree.

Binary search tree

Binary search tree (BST) adalah tree dengan paling banyak dua anak per simpul, dan aturan: semua nilai di subpohon kiri lebih kecil dari simpul, semua nilai di subpohon kanan lebih besar.

Bentuk BST setelah memasukkan 50, 30, 70, 20, 40, 60, 80
        50
       /  \
     30    70
    /  \  /  \
   20  40 60  80
Python
1class Simpul:2    def __init__(self, nilai):3        self.nilai = nilai4        self.kiri = None5        self.kanan = None678class BST:9    def __init__(self):10        self.akar = None1112    def masukkan(self, nilai):13        if self.akar is None:14            self.akar = Simpul(nilai)15            return16        sekarang = self.akar17        while True:18            if nilai < sekarang.nilai:19                if sekarang.kiri is None:20                    sekarang.kiri = Simpul(nilai)21                    return22                sekarang = sekarang.kiri23            else:24                if sekarang.kanan is None:25                    sekarang.kanan = Simpul(nilai)26                    return27                sekarang = sekarang.kanan2829    def cari(self, nilai):30        sekarang = self.akar31        langkah = 032        while sekarang is not None:33            langkah += 134            if nilai == sekarang.nilai:35                return True, langkah36            sekarang = sekarang.kiri if nilai < sekarang.nilai else sekarang.kanan37        return False, langkah3839    def inorder(self):40        hasil = []41        def jalan(s):42            if s is not None:43                jalan(s.kiri)44                hasil.append(s.nilai)45                jalan(s.kanan)46        jalan(self.akar)47        return hasil4849    def tinggi(self):50        def t(s):51            if s is None:52                return 053            return 1 + max(t(s.kiri), t(s.kanan))54        return t(self.akar)555657pohon = BST()58for x in [50, 30, 70, 20, 40, 60, 80]:59    pohon.masukkan(x)60print("Inorder:", pohon.inorder())61print("Cari 60:", pohon.cari(60))62print("Cari 65:", pohon.cari(65))63print("Tinggi:", pohon.tinggi())
Keluaran
Inorder: [20, 30, 40, 50, 60, 70, 80]
Cari 60: (True, 3)
Cari 65: (False, 3)
Tinggi: 3
  • Penelusuran inorder (kiri, simpul, kanan) selalu menghasilkan data terurut.
  • Pencarian membuang setengah pohon di setiap langkah, mirip pencarian biner. Untuk pohon yang seimbang, kompleksitasnya O(log n).

Pohon yang tidak seimbang

Jika data dimasukkan dalam keadaan sudah urut, BST berubah menjadi rantai panjang:

Python
1class Simpul:2    def __init__(self, nilai):3        self.nilai = nilai4        self.kiri = None5        self.kanan = None678def masukkan(akar, nilai):9    if akar is None:10        return Simpul(nilai)11    if nilai < akar.nilai:12        akar.kiri = masukkan(akar.kiri, nilai)13    else:14        akar.kanan = masukkan(akar.kanan, nilai)15    return akar161718def tinggi(s):19    return 0 if s is None else 1 + max(tinggi(s.kiri), tinggi(s.kanan))202122acak = None23for x in [50, 30, 70, 20, 40, 60, 80, 10, 90, 35]:24    acak = masukkan(acak, x)25urut = None26for x in range(1, 11):27    urut = masukkan(urut, x)28print("Tinggi BST dari data acak:", tinggi(acak))29print("Tinggi BST dari data urut:", tinggi(urut))
Keluaran
Tinggi BST dari data acak: 4
Tinggi BST dari data urut: 10

Pada kasus terburuk ini, pencarian menjadi O(n). Pohon seimbang seperti AVL tree dan red-black tree memutar simpul secara otomatis saat memasukkan data, sehingga tingginya selalu O(log n). Struktur seperti TreeMap di Java dibangun dari red-black tree.

Cek pemahaman

Pada BST, di mana letak nilai terkecil?

Latihan

Nilai terkecil dan banyak simpul

Tulis fungsi terkecil(akar) dan fungsi rekursif banyak_simpul(akar). Uji dengan BST dari data 50, 30, 70, 20, 40, 60, 80, 10.

Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Python online.

Tandai pelajaran ini selesai

Masuk ke aplikasi untuk mencatat kemajuan, lalu lanjutkan ke pelajaran berikutnya dari perangkat mana pun.

Buka di aplikasi