ツリー構造の問題

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

問題

f:id:naosim:20191022165557p:plain

図のようなツリー構造を作る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>