以下はC#で書いた二分木のクラスです。 https://lets-csharp.com/binary-search-tree-cs/ を参考にしましたが、とりあえず挿入と表示だけです。 public class Node { public Node(string key) { Key = key; } public string Key = null; public Node Left = null; public Node Right = null; } public class BinarySearchTree { public Node Root { private set; get; } //挿入 public void Insert(string value) { if (Root == null) { Root = new Node(value); return; } Node cur = Root; while (true) { int comparison = string.Compare(cur.Key, value); if (comparison == 0) { // 値が既に存在する場合、挿入せず終了 MessageBox.Show($"値 '{value}' は既に存在します。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else if (comparison > 0) { if (cur.Left == null) // 左部分木に移動 { cur.Left = new Node(value); return; } cur = cur.Left; } else { if (cur.Right == null) // 右部分木に移動 { cur.Right = new Node(value); return; } cur = cur.Right; } } } // 木を文字列として出力 ⇒ここを変更したい public override string ToString() { return ToString(Root, 0); } private string ToString(Node node, int depth) { if (node == null) return ""; // 左部分木を再帰的に文字列化 string left = ToString(node.Left, depth + 1); // 現在のノードを空白でインデント string current = new string(' ', depth * 4) + node.Key + Environment.NewLine; // 右部分木を再帰的に文字列化 string right = ToString(node.Right, depth + 1); return right + current + left; } } ボタンで次のように実行する。 public partial class Form1 : Form { BinarySearchTree bst = new BinarySearchTree(); private void BtnTest_Click(object sender, EventArgs e) { var StrList = new List<string>(); StrList.Add("Sayaka"); StrList.Add("Kayoko"); StrList.Add("Natsuko"); StrList.Add("Miwako"); StrList.Add("Ranko"); StrList.Add("Yayoi"); StrList.Add("Asuka"); StrList.Add("Reika"); StrList.Add("Chisato"); StrList.Add("Wakana"); foreach (string str in StrList) bst.Insert(str); // 出力用テキストボックスに表示 TextBoxOut.Text = bst.ToString(); } } 出力用テキストボックスに次のように表示されます。 Yayoi Wakana Sayaka Reika Ranko Natsuko Miwako Kayoko Chisato Asuka 親子関係を明確にするために、各項目の行間を開け、罫線を使って次のように表示したい。 string ToString() をどのように修正したらいいでしょうか? ┌Yayoi │ │ ← 項目間は1行明けるので '│' を追加 │ └Wakana │ Sayaka┤ │ │ ┌Reika │ │ │ ┌Ranko┘ │ │ │ ┌Natsuko┤ │ │ │ │ │ └Miwako │ │ └Kayoko┤ │ └Asuka ChatGpt 先生に相談しながら以下のようなコードをいろいろ試しているのですが、うまくいきません。 public override string ToString() { return ToString(Root, "", true); } private string ToString(Node node, string prefix, bool isLeft) { if (node == null) return ""; // 自身の文字列を構築 var currentLine = prefix; if (!string.IsNullOrEmpty(prefix)) { currentLine += isLeft ? "└" : "┌"; } currentLine += node.Key + Environment.NewLine; // 左右の子を再帰的に文字列化 string left = ToString(node.Left, prefix + (isLeft ? " " : "│ "), true); string right = ToString(node.Right, prefix + (isLeft ? " " : "│ "), false); return right + currentLine + left; }
管理者用
- Child Tree -