ツリー構造の問題
プログラミングの問題です。
親子関係のあるツリー構造の問題です。
親が子を持つか、子が親を持つか、相互に持つか、考え始めるといつも悶々としてしまうんですよねー。特に答えはないですが悶々としてみてください。
以下はjavascriptで書いてますが言語はなんでも良いと思います。
問題

図のようなツリー構造を作るTreeFactoryを作成したい。
下記の問題テンプレの// 実装してくださいの部分を埋めて、全体がエラーなく実行される状態にしてください。
// 実装してください以外の場所にメソッド等を実装しても良いです。
ツリー構造の説明
要素
- 要素はIDと値を持っている
- 要素にはノードとリーフの種類がある
リーフ
- 子供の要素を持たない
- idはツリー全体でユニークであれば良い
- 値は1(固定)
ノード
- 子供の要素を1つ以上持つ
- idはツリー全体でユニークであれば良い
- 値は配下にあるリーフの総数
問題テンプレ
<!DOCTYPE html> <script> class TreeFactory { add(id, parentOption) { // 実装してください } find(id) { // 実装してください return {id: '-1', value: -1} } update(id, parent) { // 実装してください } } // 期待する挙動 // (1) ツリー構造の構築 const treeFactory = new TreeFactory(); treeFactory.add('A') treeFactory.add('E', 'B') treeFactory.add('B', 'A') treeFactory.add('C', 'A') treeFactory.add('D', 'B') const a = treeFactory.find('A') assert('(1)-1', `id:${a.id}, value:${a.value}`, 'id:A, value:3') const b = treeFactory.find('B') assert('(1)-2', `id:${b.id}, value:${b.value}`, 'id:B, value:2') // -- ここまでで図と同じ状態 // (2) ツリーへの追加 treeFactory.add('F', 'B') treeFactory.add('G', 'C') const a2 = treeFactory.find('A') assert('(2)-1', `id:${a2.id}, value:${a2.value}`, 'id:A, value:4') // (3)ツリーの変更 treeFactory.update('D', 'A')// DをA直下にぶら下げる const a3 = treeFactory.find('A') assert('(3)-1', `id:${a3.id}, value:${a3.value}`, 'id:A, value:4') const b3 = treeFactory.find('B') assert('(3)-2', `id:${b3.id}, value:${b3.value}`, 'id:B, value:2') // 確認用 function assert(message, actual, expect) { if(actual !== expect) { console.error(message, 'エラー', `${actual} != ${expect}`) return; } console.log(message, 'OK'); } </script>