Manakah struktur data terbaik yang dapat digunakan untuk mengimplementasikan pohon biner dengan Python?
104
Manakah struktur data terbaik yang dapat digunakan untuk mengimplementasikan pohon biner dengan Python?
Jawaban:
Berikut adalah implementasi rekursif sederhana saya dari pohon pencarian biner.
sumber
node is not None
bukan Anda(node!=None)
. Selain itu, Anda dapat menggunakan__str__
fungsi tersebut sebagai ganti metode printTree.def _find(self, val, node): if(val == node.v): return node elif(val < node.v and node.l != None): return self._find(val, node.l) elif(val > node.v and node.r != None): return self._find(val, node.r)
left<=root<=right
?Baca lebih lanjut di sini: -Ini adalah implementasi yang sangat sederhana dari pohon biner.
Ini adalah tutorial yang bagus dengan pertanyaan di antaranya
sumber
insertLeft
rusak dan akan menghasilkan loop tak terbatas pada setiap upaya untuk melintasi cabang paling kiri pohon biner secara[Yang Anda perlukan untuk wawancara] Kelas Node adalah struktur data yang cukup untuk merepresentasikan pohon biner.
(Meskipun sebagian besar jawaban lain benar, namun tidak diperlukan untuk pohon biner: tidak perlu memperluas kelas objek, tidak perlu menjadi BST, tidak perlu mengimpor deque).
Berikut adalah contoh pohon:
Dalam contoh ini n1 adalah akar pohon yang memiliki n2, n3 sebagai anak-anaknya.
sumber
Implementasi sederhana BST dengan Python
sumber
Cara yang sangat cepat dan kotor dalam mengimplementasikan pohon biner menggunakan daftar. Bukan yang paling efisien, juga tidak menangani nilai nihil dengan baik. Tapi itu sangat transparan (setidaknya bagi saya):
Membangun pohon dari iterable:
Melintasi pohon:
sumber
Saya tidak bisa tidak memperhatikan bahwa sebagian besar jawaban di sini menerapkan Pohon Pencarian Biner. Pohon Pencarian Biner! = Pohon Biner.
Pohon Pencarian Biner memiliki properti yang sangat spesifik: untuk setiap node X, kunci X lebih besar dari kunci turunan mana pun dari turunan kirinya, dan lebih kecil dari kunci turunan mana pun dari turunan kanannya.
Pohon Biner tidak menerapkan batasan seperti itu. Binary Tree hanyalah sebuah struktur data dengan elemen 'key', dan dua anak, katakanlah 'left' dan 'right'.
Pohon adalah kasus yang lebih umum dari Pohon Biner di mana setiap node dapat memiliki jumlah anak yang berubah-ubah. Biasanya, setiap node memiliki elemen 'anak' yang bertipe list / array.
Sekarang, untuk menjawab pertanyaan OP, saya menyertakan implementasi penuh Binary Tree dengan Python. Struktur data yang mendasari yang menyimpan setiap BinaryTreeNode adalah kamus, karena ia menawarkan pencarian O (1) yang optimal. Saya juga telah menerapkan traversal depth-first dan breadth-first. Ini adalah operasi yang sangat umum dilakukan di pohon.
sumber
Anda tidak perlu memiliki dua kelas
sumber
Sedikit lebih "Pythonic"?
sumber
sumber
Node
Kelas node terhubung berbasis A adalah pendekatan standar. Ini mungkin sulit untuk divisualisasikan.Dimotivasi dari esai tentang Pola Python - Menerapkan Grafik , pertimbangkan kamus sederhana:
Diberikan
Pohon biner
Kode
Buat kamus node unik :
Detail
find_all_paths()
).Fungsi berbasis pohon sering kali mencakup operasi umum berikut:
Coba terapkan semua operasi ini. Di sini kami mendemonstrasikan salah satu fungsi ini - traversal BFS:
Contoh
Ini adalah algoritme penelusuran luas-pertama (urutan-tingkat) yang diterapkan ke perintah node dan turunan.
deque
, tetapi aqueue
ataulist
karya (yang terakhir tidak efisien).Lihat juga tutorial mendalam tentang pepohonan.
Wawasan
Sesuatu yang hebat tentang traversal secara umum, kita dapat dengan mudah mengubah pendekatan iteratif terakhir untuk pencarian kedalaman-pertama (DFS) hanya dengan mengganti antrian dengan tumpukan (alias LIFO Queue). Ini berarti kami membatalkan antrean dari sisi yang sama dengan yang kami antre. DFS memungkinkan kita untuk mencari setiap cabang.
Bagaimana? Karena kami menggunakan a
deque
, kami dapat meniru tumpukan dengan mengubahnode = q.popleft()
kenode = q.pop()
(kanan). Hasilnya adalah hak-disukai, DFS pra-memerintahkan :['a', 'c', 'f', 'b', 'e', 'd']
.sumber
sumber
Implementasi ini mendukung operasi penyisipan, pencarian, dan penghapusan tanpa merusak struktur pohon. Ini bukan pohon banlanced.
sumber
Saya tahu banyak solusi bagus telah diposting tetapi saya biasanya memiliki pendekatan yang berbeda untuk pohon biner: menggunakan beberapa kelas Node dan menerapkannya secara langsung lebih mudah dibaca tetapi ketika Anda memiliki banyak node, itu bisa menjadi sangat rakus mengenai memori, jadi saya menyarankan untuk menambahkan satu lapisan kompleksitas dan menyimpan node dalam daftar python, dan kemudian mensimulasikan perilaku pohon hanya dengan menggunakan daftar.
Anda masih dapat menentukan kelas Node untuk akhirnya merepresentasikan node di pohon saat diperlukan, tetapi menyimpannya dalam bentuk sederhana [nilai, kiri, kanan] dalam daftar akan menggunakan setengah memori atau kurang!
Berikut adalah contoh cepat dari kelas Pohon Pencarian Biner yang menyimpan node dalam sebuah array. Ini menyediakan fonctions dasar seperti tambah, hapus, temukan ...
Saya telah menambahkan atribut induk sehingga Anda dapat menghapus node apa pun dan mempertahankan struktur BST.
Maaf atas keterbacaannya, terutama untuk fungsi "hapus". Pada dasarnya, ketika sebuah node dihapus, kita memunculkan array pohon dan menggantinya dengan elemen terakhir (kecuali jika kita ingin menghapus node terakhir). Untuk mempertahankan struktur BST, node yang dihapus diganti dengan max dari anak kirinya atau min dari anak kanannya dan beberapa operasi harus dilakukan untuk menjaga agar indeks tetap valid tetapi cukup cepat.
Saya menggunakan teknik ini untuk hal-hal yang lebih maju untuk membangun beberapa kamus kata-kata besar dengan radix trie internal dan saya dapat membagi konsumsi memori dengan 7-8 (Anda dapat melihat contohnya di sini: https://gist.github.com/fbparis / b3ddd5673b603b42c880974b23db7cda )
sumber
Implementasi yang baik dari pohon pencarian biner , diambil dari sini :
sumber
Saya ingin menunjukkan variasi metode @ apadana, yang lebih berguna bila ada banyak node:
sumber
sumber
Pohon Biner dengan Python
sumber
Berikut adalah solusi sederhana yang dapat digunakan untuk membangun pohon biner menggunakan pendekatan rekursif untuk menampilkan pohon agar traversal telah digunakan pada kode di bawah ini.
Kode diambil dari: Binary Tree dengan Python
sumber