Saya sedang mencari struktur data pohon atau grafik di C # tapi saya kira tidak ada yang disediakan. Pemeriksaan Ekstensif Struktur Data Menggunakan C # 2.0 menjelaskan sedikit tentang mengapa. Apakah ada perpustakaan yang nyaman yang biasanya digunakan untuk menyediakan fungsionalitas ini? Mungkin melalui pola strategi untuk menyelesaikan masalah yang disajikan dalam artikel.
Saya merasa agak konyol menerapkan pohon saya sendiri, sama seperti saya akan mengimplementasikan ArrayList saya sendiri.
Saya hanya ingin pohon generik yang tidak seimbang. Pikirkan pohon direktori. C5 terlihat bagus, tetapi struktur pohon mereka tampaknya diimplementasikan sebagai pohon merah-hitam seimbang yang lebih cocok untuk dicari daripada mewakili hierarki node.
sumber
Jawaban:
Saran terbaik saya adalah bahwa tidak ada struktur data pohon standar karena ada banyak cara Anda dapat mengimplementasikannya sehingga tidak mungkin untuk menutup semua pangkalan dengan satu solusi. Semakin spesifik suatu solusi, semakin kecil kemungkinannya untuk diterapkan pada masalah apa pun. Saya bahkan merasa terganggu dengan LinkedList - bagaimana jika saya ingin daftar tertaut melingkar?
Struktur dasar yang harus Anda implementasikan adalah kumpulan node, dan berikut adalah beberapa opsi untuk Anda mulai. Mari kita asumsikan bahwa kelas Node adalah kelas dasar dari seluruh solusi.
Jika Anda hanya perlu menavigasi turun pohon, maka kelas Node membutuhkan Daftar anak-anak.
Jika Anda perlu menavigasi pohon, maka kelas Node membutuhkan tautan ke simpul induknya.
Bangun metode AddChild yang menangani semua hal-hal kecil dari dua poin ini dan semua logika bisnis lain yang harus diterapkan (batas anak, pemilahan anak-anak, dll.)
sumber
Implementasi rekursif sederhana ... <40 baris kode ... Anda hanya perlu menyimpan referensi ke akar pohon di luar kelas, atau membungkusnya di kelas lain, mungkin mengubah nama menjadi TreeNode ??
sumber
Action<T>
delegasi:public void traverse(NTree<T> node, Action<T> visitor)
. Aksi <> tanda tangan adalah:void Action<T>( T obj )
. Ada juga versi dari 0 hingga 4 parameter yang berbeda. Ada juga delegasi analog untuk fungsi-fungsi yang disebutFunc<>
.--i == 0
akan berfungsi pada satu kasus? Apakah ini benar. Ini membuat saya bingungIni milik saya, yang sangat mirip dengan milik Aaron Gage , hanya sedikit lebih konvensional, menurut pendapat saya. Untuk tujuan saya, saya belum pernah mengalami masalah kinerja
List<T>
. Akan cukup mudah untuk beralih ke LinkedList jika diperlukan.sumber
public TreeNode<T> InsertChild(TreeNode<T> parent, T value) { var node = new TreeNode<T>(value) { Parent = parent }; parent._children.Add(node); return node; }
var five = myTree.AddChild(5); myTree.InsertChild(five, 55);
Namun struktur pohon lain:
Penggunaan sampel:
BONUS
Lihat pohon lengkap dengan:
https://github.com/gt4dev/yet-another-tree-structure
sumber
node
? Apakah itu berarti saya harus beralih di atas pohon untuk menggunakan kode pencarian?IEnumerable<>
anggota, jadi tidak dapat dikompilasi.Perpustakaan Koleksi Umum C5 yang sangat bagus memiliki beberapa struktur data berbasis pohon yang berbeda, termasuk set, tas dan kamus. Kode sumber tersedia jika Anda ingin mempelajari detail implementasi mereka. (Saya telah menggunakan koleksi C5 dalam kode produksi dengan hasil yang baik, meskipun saya belum menggunakan struktur pohon secara khusus.)
sumber
Lihat http://quickgraph.codeplex.com/
QuickGraph menyediakan datastructures dan algoritma grafik yang diarahkan / tidak diarahkan secara umum untuk .Net 2.0 dan yang lebih tinggi. QuickGraph hadir dengan algoritme seperti pencarian kedalaman pertama, pencarian pertama nafas, pencarian A *, jalur terpendek, jalur terpendek k, aliran maksimum, pohon rentang minimum, leluhur paling tidak umum, dll. QuickGraph mendukung MSAGL, GLEE, dan Graphviz untuk render grafik, serialisasi ke GraphML, dll ...
sumber
Jika Anda ingin menulis sendiri, Anda dapat mulai dengan dokumen enam bagian ini yang merinci penggunaan efektif struktur data C # 2.0 dan bagaimana cara menganalisis implementasi struktur data Anda dalam C #. Setiap artikel memiliki contoh dan installer dengan sampel yang dapat Anda ikuti.
"Pemeriksaan Ekstensif Struktur Data Menggunakan C # 2.0" oleh Scott Mitchell
sumber
Saya punya sedikit ekstensi untuk solusi.
Dengan menggunakan deklarasi generik rekursif dan subclass turunan, Anda dapat lebih berkonsentrasi pada target Anda yang sebenarnya.
Perhatikan, ini berbeda dari implementasi non generik, Anda tidak perlu menggunakan 'node' di 'NodeWorker'.
Inilah contoh saya:
sumber
Ini milik saya:
Keluaran:
sumber
Coba contoh sederhana ini.
sumber
Saya membuat kelas Node yang bisa membantu orang lain. Kelas memiliki properti seperti:
Ada juga kemungkinan untuk mengonversi daftar datar item dengan Id dan ParentId ke pohon. Node memegang referensi untuk anak-anak dan orang tua, sehingga membuat node pengulangan cukup cepat.
sumber
Karena tidak disebutkan, saya ingin Anda menarik basis kode .net yang sekarang dirilis: khusus kode untuk
SortedSet
yang mengimplementasikan Red-Black-Tree:https://github.com/Microsoft/referencesource/blob/master/System/compmod/system/collections/generic/sortedset.cs
Namun ini adalah struktur pohon yang seimbang. Jadi jawaban saya lebih merujuk pada apa yang saya yakini sebagai satu-satunya struktur pohon asli di perpustakaan inti .net.
sumber
Saya telah menyelesaikan kode yang dibagikan @Berezh.
sumber
Ini Pohon
Anda bahkan dapat menggunakan inisialisasi:
sumber
Sebagian besar pohon dibentuk oleh data yang Anda proses.
Contoh lain adalah pohon parse di kompiler ...
Apa yang ditunjukkan kedua contoh ini adalah bahwa konsep pohon adalah bagian dari domain data dan menggunakan pohon tujuan umum yang terpisah setidaknya menggandakan jumlah objek yang dibuat serta membuat API lebih sulit untuk diprogram lagi.
Apa yang kita inginkan adalah cara untuk menggunakan kembali operasi pohon standar, tanpa harus mengimplementasikannya kembali untuk semua pohon, sementara pada saat yang sama, tidak harus menggunakan kelas pohon standar. Boost telah mencoba menyelesaikan masalah jenis ini untuk C ++, tetapi saya belum melihat efek apa pun untuk .NET diadaptasi.
sumber
Saya telah menambahkan solusi lengkap dan contoh menggunakan kelas NTree di atas, juga menambahkan metode "AddChild" ...
menggunakan
sumber
Inilah implementasi BST saya
sumber
Jika Anda akan menampilkan pohon ini pada GUI, Anda dapat menggunakan TreeView dan TreeNode . (Saya kira secara teknis Anda dapat membuat TreeNode tanpa meletakkannya di GUI, tetapi ia memiliki lebih banyak overhead daripada implementasi TreeNode sederhana buatan sendiri.)
sumber
Jika Anda membutuhkan implementasi struktur data pohon yang di-rooting yang menggunakan lebih sedikit memori, Anda dapat menulis kelas Node Anda sebagai berikut (implementasi C ++):
sumber