二分木の表示

作成日 : 2025-11-14
最終更新日 :

はじめに

最近、二分木をかっこよくブラウザで表示させるにはどうすればいいか、悩んでいる。以下は、その苦闘の記録だ。

自分で考えてみる

二分木とは、根付きの木構造の中で、全てのノード(節点、node)が持つ子の数が高々2であるものをいう。これを表示するのは簡単そうだが、ではどうすればいいのかわからない。

まず、ノードの配置をどうすればいいのかがわからない。そして、親から子への有向線分である斜めの線を出すにはどうすればいいのかもわからない。

ノードの配置は最初、table 要素を使って実装しようとしたが、これは table 要素をレイアウトに使おうとしているので誤りだ。 レイアウトのために使うのならば CSS のフレックスボックスかグリッドのいずれかを使わないといけないのだろうが、 どちらも使い方がわからない。

斜めの線を出すには CSS が使えるはずだが、どうすればいいのかがわからない。ひょっとしたら、SVG を使うのがいいのだろうか。それとも canvas を使うのだろうか。

ここで一度自分で考えるのを中止し、検索エンジンに頼ることにした。

検索エンジンでヒントをつかもうとする

そこで検索エンジンで、「javascript や CSS で二分木を表示する方法を教えて」と入力してみた。すると、記事がいくつか見つかった。ただ、私の実装で参考になりそうな記事は、

seiketkm 氏による、 二分木をブラウザにカッコよく描画する(qiita.com)だけだった。 この方法では、vis.js(visjs.org) というライブラリを使っている。 背景は、この記事をもとに作った二分木を表示している。

Google AI による解

検索エンジンだけではうまくいかないように見えたので、生成 AI に頼ることにした。最初は Google の AI である。回答は次の通りだった。

1. HTML/CSSとJavaScriptを使用する方法

2. Canvas APIを使用する方法

3. JavaScriptライブラリを使用する方法

どの方法を選ぶかは、必要な機能や開発の複雑さによって異なります。単純な表示であればHTML/CSSとJavaScript、複雑なアニメーションや操作が必要であればCanvas API、効率的に高品質な表示を行いたい場合はライブラリの利用がおすすめです。

AI にはさらに詳しい回答を求めてみたが、1. 2. に関してはそれほど深い情報は得られず、3. に関しては D3.js のほか vis.js を勧められた程度である。しかし、AI が参考にしたサイトとして、 Nori 氏のプログラミング未経験者がRecursionで1年勉強して、OSS開発にチャレンジした話 (note.com) が挙げられていた。これは役に立ちそうだ。

ChatGPT による解

次に頼った生成 AI は、生成 AI 元祖の ChatGPT である。結果は、JavaScript のコードまで例示してくれた。これは、データ構造に JavaScript を、 線の描画に Canvas API を使って描くコードである。さすが老舗だけのことはある。得られる図は右のとおりである。

ここまでくればあと一息のようだが、実は私のやりたいことは Canvas API では実現できそうにない。 というのは、ノードの値として表示したいのは、 1 とか abc とかの単なる文字列だけではなく、数式も表示したいと思っている。Canvas API を使う限り、数式をノードの値として表示することはできないのではないか。

Canvas がだめなら SVG がある、とも考えたのだが、SVG で文字列を扱う API でも数式を扱うことはできないのではなかっただろうか。まだまだ悩みは尽きない。

ソフトウェア科学のための論理学には構文木を作った例を載せた。

ちなみに数式としては、たとえば論理式がある。この論理式を二分木のノードに書ければ、タブロー図が得られるというわけだ。 論理学を作るなどを参照してほしい。

論理式を二分木に表示するには、画像上に文字を表示するのと同じようにすればできるのではないかと考えた。

2024 年越谷市公民館にて
\( x_0 \)
\( x_0 \)
\( x_0 \)

その他の方法

そのほか、生成 AI として、Duck.ai にも頼ってみたが、ブラウザに表示させた結果が、通常の2分木とは異なる図になった(ノードから分岐していない)ため、採用できなかった

まりんきょ学問所 > JavaScript 手習い > 二分木の表示


MARUYAMA Satosi