Bagaimana saya bisa mencetak pohon biner di Jawa sehingga hasilnya seperti:
4
/ \
2 5
Simpul saya:
public class Node<A extends Comparable> {
Node<A> left, right;
A data;
public Node(A data){
this.data = data;
}
}
java
printing
binary-tree
Tian
sumber
sumber
Jawaban:
Saya telah membuat printer pohon biner sederhana. Anda dapat menggunakan dan memodifikasinya seperti yang Anda inginkan, tetapi itu tetap tidak dioptimalkan. Saya pikir banyak hal dapat diperbaiki di sini;)
Output 1:
Output 2:
sumber
Cetak pohon [besar] demi baris.
contoh output:
kode:
PS Jawaban ini tidak persis berfokus pada pohon "biner" - sebagai gantinya, ia mencetak semua jenis pohon. Solusi diilhami oleh perintah "tree" di linux.
sumber
children.get(children.size() - 1)
jika HashMap digunakan untuk anak-anak? Saya berhasil memodifikasi setiap bagian selain bagian ini.HashMap<String, List<String>>
?HashMap<String, Node>
. String adalah id Node.Saya telah membuat algoritma yang ditingkatkan untuk ini, yang menangani node dengan ukuran yang berbeda. Mencetak top-down menggunakan garis.
Untuk menggunakan ini untuk Pohon Anda, biarkan
Node
kelas Anda menerapkanPrintableNode
.Contoh output:
sumber
???????????
alih-alih garis antara node tetapi harus hanya beberapa masalah barang UTF8 ans. Bagaimanapun, hal-hal hebat, saya harus katakan. Jawaban terbaik bagi saya karena sangat mudah digunakan.public static <T> void print(T[] elems)
akan dicetak:
untuk input
8 4 12 2 6 10 14 1 3 5 7 9 11 13 20 15
ini adalah varian dari jawaban @ anurag - itu menggangguku untuk melihat ekstra | s
sumber
Diadaptasi dari Vasya Novikov 's jawaban untuk membuatnya lebih biner , dan menggunakan
StringBuilder
untuk efisiensi (concatenatingString
benda bersama-sama di Jawa umumnya tidak efisien).Keluaran:
sumber
right != null
Saya melakukan edit dan mengujinya, itu berfungsi dengan baik.michal.kreuzman bagus saya harus katakan.
Saya merasa malas membuat program sendiri dan mencari kode di internet ketika saya menemukan ini sangat membantu saya.
Tetapi saya takut melihat bahwa itu hanya berfungsi untuk satu digit saja seolah-olah Anda akan menggunakan lebih dari satu digit, karena Anda menggunakan spasi dan tidak tab struktur akan salah tempat dan program akan kehilangan penggunaannya.
Adapun kode saya nanti saya butuh beberapa input yang lebih besar (setidaknya lebih dari 10) ini tidak bekerja untuk saya, dan setelah mencari banyak di internet ketika saya tidak menemukan apa-apa, saya membuat program sendiri.
Ini memiliki beberapa bug sekarang, lagi sekarang saya merasa malas untuk memperbaikinya tetapi mencetak sangat indah dan node dapat mengambil nilai besar.
Pohon itu tidak akan seperti pertanyaan yang disebutkan tetapi dirotasi 270 derajat :)
Tempatkan fungsi ini dengan TreeNode yang Anda tentukan sendiri dan pertahankan level awalnya 0, dan selamat menikmati!
Berikut adalah beberapa contoh keluaran:
Satu-satunya masalah adalah dengan cabang yang diperluas; Saya akan mencoba menyelesaikan masalah sesegera mungkin tetapi sampai saat itu Anda dapat menggunakannya juga.
sumber
Pohon Anda membutuhkan jarak dua kali lipat untuk setiap lapisan:
Anda dapat menyimpan pohon Anda dalam array array, satu array untuk setiap kedalaman:
Jika pohon Anda tidak penuh, Anda harus memasukkan nilai kosong dalam array itu:
Kemudian Anda dapat beralih di atas array untuk mencetak pohon Anda, mencetak spasi sebelum elemen pertama dan antara elemen tergantung pada kedalaman dan mencetak garis tergantung pada apakah elemen yang sesuai dalam array untuk lapisan berikutnya diisi atau tidak. Jika nilai Anda bisa lebih dari satu karakter, Anda harus menemukan nilai terpanjang sambil membuat representasi array dan melipatgandakan semua lebar dan jumlah garis yang sesuai.
sumber
Saya menemukan jawaban VasyaNovikov sangat berguna untuk mencetak pohon umum yang besar, dan memodifikasinya untuk pohon biner
Kode:
Output sampel:
sumber
Solusi dalam bahasa Scala , analog dengan apa yang saya tulis di java :
Contoh keluaran:
sumber
Saya tahu kalian semua memiliki solusi hebat; Saya hanya ingin berbagi milik saya - mungkin itu bukan cara terbaik, tetapi itu sempurna untuk diri saya sendiri!
Dengan
python
danpip
terus, itu benar-benar sangat sederhana! LEDAKAN!Di Mac atau Ubuntu (milik saya adalah mac)
$ pip install drawtree
$python
, masukkan konsol python; Anda bisa melakukannya dengan cara lainfrom drawtree import draw_level_order
draw_level_order('{2,1,3,0,7,9,1,2,#,1,0,#,#,8,8,#,#,#,#,7}')
DIBUAT!
Pelacakan sumber:
Sebelum saya melihat posting ini, saya pergi ke google "binary tree plain text"
Dan saya menemukan ini https://www.reddit.com/r/learnpython/comments/3naiq8/draw_binary_tree_in_plain_text/ , mengarahkan saya ke https://github.com/msbanik/drawtree ini
sumber
java
dia mengharapkan jawaban Java :)sumber
Ini adalah solusi yang sangat sederhana untuk mencetak pohon. Ini tidak cantik, tetapi sangat sederhana:
Output sampel:
sumber
Berdasarkan jawaban VasyaNovikov. Ditingkatkan dengan beberapa sihir Java: Antarmuka Generik dan Fungsional.
Contoh panggilan awal:
Akan menampilkan sesuatu seperti
sumber
Saya menulis printer pohon biner di Jawa.
Kode ada di GitHub di sini .
Ini belum dioptimalkan untuk efisiensi waktu berjalan, tetapi karena kita berbicara tentang mencetak di ASCII, saya pikir itu tidak akan digunakan pada pohon yang sangat besar. Itu memang memiliki beberapa fitur yang bagus.
Beberapa program demo / uji disertakan.
Contoh pohon biner yang dihasilkan secara acak, seperti yang dicetak oleh program, berikut. Ini menggambarkan penggunaan ruang yang efisien, dengan subtree kanan besar memanjang di bawah subtree kiri kecil:
Contoh mencetak semua lima pohon simpul biner (dengan label berurutan) di seluruh halaman:
Berikut ini adalah contoh dari pohon yang sama dicetak 4 cara yang berbeda, dengan jarak horizontal 1 dan 3, dan dengan cabang diagonal dan horizontal.
sumber
@Makyen
komentar.Ini pertanyaan yang menarik, dan saya juga menulis proyek untuk itu.
binary-tree-printer
Berikut ini beberapa contohnya:
Cetak BST acak.
Print tree dari larik urutan tingkat gaya leetcode, '#' berarti terminator jalur di mana tidak ada simpul di bawah ini.
sumber
Saya perlu mencetak pohon biner di salah satu proyek saya, untuk itu saya telah menyiapkan kelas java
TreePrinter
, salah satu contoh hasil adalah:Ini adalah kode untuk kelas
TreePrinter
bersama dengan kelasTextNode
. Untuk mencetak pohon apa saja, Anda cukup membuat pohon setara denganTextNode
kelas.Akhirnya di sini adalah kelas uji untuk mencetak sampel yang diberikan:
sumber
Anda dapat menggunakan applet untuk memvisualisasikannya dengan sangat mudah. Anda perlu mencetak item berikut.
Cetak node sebagai lingkaran dengan jari-jari yang terlihat
Dapatkan koordinat untuk setiap node.
Koordinat x dapat divisualisasikan sebagai jumlah node yang dikunjungi sebelum node dikunjungi dalam inorder traversal.
Koordinat y dapat divisualisasikan sebagai kedalaman simpul tertentu.
Cetak garis antara orang tua dan anak-anak
Ini dapat dilakukan dengan mempertahankan koordinat x dan y dari node dan orang tua dari setiap node dalam daftar yang terpisah.
Untuk setiap node kecuali root, gabungkan setiap node dengan induknya dengan mengambil koordinat x dan y dari anak dan induknya.
sumber
https://github.com/murtraja/java-binary-tree-printer
hanya berfungsi untuk 1 hingga 2 digit bilangan bulat (saya malas membuatnya generik)
sumber
Ini adalah solusi paling sederhana untuk tampilan horizontal. Mencoba dengan banyak contoh. Bekerja dengan baik untuk tujuan saya. Diperbarui dari jawaban @ nitin-k.
Panggilan:
Larutan:
sumber
node_length * nodes_count + space_length * spaces_count*
.Kode pada GitHub: YoussefRaafatNasry / bst-ascii-visualisasi
sumber
visualize
fungsi, itu adalah seluruhvisualizer
kelas yang sekitar 200 loc termasuk file header.Bagi mereka yang mencari solusi Rust:
Outputnya kira-kira seperti ini:
sumber
Cetak di Konsol:
Kode sederhana:
sumber
Ini printer pohon yang sangat serbaguna. Bukan yang paling cantik, tetapi menangani banyak kasus. Jangan ragu untuk menambahkan garis miring jika Anda dapat menemukannya.
Kelas NodeInfo
Kelas NodePosition
Dan, akhirnya, Node Interface
sumber
Solusi Scala, diadaptasi dari jawaban Vasya Novikov dan khusus untuk pohon biner:
sumber
Lihat juga jawaban ini .
Khususnya itu tidak terlalu sulit untuk menggunakan TreeLayout untuk menghasilkan hasil yang ditunjukkan di bawah ini dengan pengaturan default.
Jika Anda mencoba alat itu, perhatikan peringatan ini: Mencetak anak-anak sesuai urutan penambahannya. Untuk BST di mana masalah kiri vs kanan, saya menemukan perpustakaan ini menjadi tidak pantas tanpa modifikasi.
Juga, metode untuk menambahkan anak-anak hanya membutuhkan a
parent
danchild
simpul sebagai parameter. (Jadi untuk memproses banyak node, Anda harus mengambil yang pertama secara terpisah untuk membuat root.)Saya akhirnya menggunakan solusi ini di atas, memodifikasinya untuk mengambil tipe
<Node>
sehingga memiliki akses keNode
kiri dan kanan (anak-anak).sumber
Berikut ini cara lain untuk memvisualisasikan struktur pohon Anda: simpan node sebagai file xml dan kemudian biarkan browser Anda menunjukkan hierarki:
Ini kode untuk mengujinya:
Dan hasilnya terlihat seperti ini:
sumber
sumber
ini adalah salah satu versi paling sederhana yang bisa saya terapkan. Saya harap ini membantu Anda
sumber