質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

2回答

6971閲覧

動的に木構造の作成をしたい

Roxas

総合スコア10

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2016/08/29 06:57

編集2016/08/29 08:00

木構造のアルゴリズムに関しての質問です。

###前提・実現したいこと
List[0]
List[1]
List[2]


List[6]

上記のようなリストを以下のような木構造のオブジェクトに変換したいです。
深さは最大で9、一つの節からの分岐数は特に上限がありません。
※スペースが反映されなかったため、見にくくなっています。

例:
root
ー|
ーーList[0]
ーーー|
ーーーList[1]
ーーーーー|
ーーーーーList[2]
ーーーーーー|
ーーーーーーList[3]
ーーー|
ーーーList[4]
ー|
ーーList[5]
ーーー|
ーーーList[6]

現状、
リンク内容
のようなサイトを参考にcompositeパターンでの実装を考えておりますが、
読み込むリストによって枝分かれが動的に変わるため、
階層が深くなった際に、子に対してindexの指定がうまくできません。

以下のような子の追加操作をスマートに記述したいです。
root.getChild(0).add(obj);
root.getChild(0).getChild(1).add(obj);

###試したこと
検索してみましたが、決め打ちでaddを行い、木構造を作成しているサンプルプログラムが多く、困っております。

わかりにくい質問で申し訳ございませんが、
知恵を貸していただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2016/08/29 08:55 編集

探索を目的としたデータコンテナとしての木構造と、Compositeパターンで登場する木構造(グラフ)は少し意味合いが異なります。この質問の主題は後者のようですね。ただ質問文からは、(入力リスト中の)あるデータが同じ深さレベルに属するのか/子として扱うのか基準がわかりません。
guest

回答2

0

以下のような子の追加操作をスマートに記述したいです。

root.getChild(0).add(obj);
root.getChild(0).getChild(1).add(obj);

こんなカンジなのかしら:

Java

1public class BNode { 2 private BNode left_ = null; 3 private BNode right_ = null; 4 private BNode parent_ = null; 5 6 private String name_; 7 8 public BNode(String name) { name_ = name; } 9 public BNode right() { return right_; } 10 public BNode left() { return left_; } 11 public BNode parent() { return parent_; } 12 public BNode setRight(BNode node) { right_ = node; node.parent_ = this; return node; } 13 public BNode setLeft(BNode node) { left_ = node; node.parent_ = this; return node; } 14 15 public String indent() { return parent_ == null ? "" : parent_.indent() + " "; } 16 17 public void print() { if ( left() != null ) { System.out.print(indent()); left().print(); } 18 System.out.print(indent()); System.out.println(name_); 19 if ( right() != null ) { System.out.print(indent()); right().print(); } } 20 21 public static void main(String[] args) { 22 BNode root = new BNode("root"); 23 24 root.setLeft( new BNode("left") ) 25 .setLeft( new BNode("left-left") ) 26 .parent().setRight(new BNode("left-right")); 27 28 root.setRight(new BNode("right")) 29 .setRight(new BNode("right-right")) 30 .parent().setLeft( new BNode("right-left")); 31 32 root.print(); 33 } 34 35}

投稿2016/08/29 22:33

編集2016/08/30 01:50
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

既に存在するリストに対して、 なんらかの条件で適当に枝を分岐させ、木構造の形に変換したい

要件がふわっとしすぎていて意図を汲み取れませんが、「バイナリヒープ(二分ヒープ)」あたりを調べてみてはいかがでしょう。配列などの1次元データ構造上に構築できる木構造の一種です。

良いアルゴリズムがなかなか考えつきません。

まずは、アルゴリズムが確立している教科書レベルの木構造を一通り調べられたほうがよいです。比較的有名なところでは「AVL木」「ヒープ」「赤黒木」「B木」あたりでしょうか。

投稿2016/08/29 07:10

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Roxas

2016/08/29 08:03

回答ありがとうございます。 実現したいことを詳しく書いてみました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問