Basic CS HA [Tree Map]



Pseudo−TreeMaker関数を古典的に完成させ,その中のaddChild法とmap法を完成させた。


マイコード:
const TreeMaker = function (value) {
  this.value = value;
  this.children = [];
};

TreeMaker.prototype.addChild = function(child) {
  let newNode = new TreeMaker(child);
  this.children.push(newNode);
  return newNode;
  
};

TreeMaker.prototype.map = function(callback) {
  const temp = new TreeMaker(this.value);
  temp.value = callback(this.value);
  temp.children = [];
  if(this.children.length !== 0){
    for(let i = 0; i < this.children.length; i++){
      temp.children[i] = this.children[i].map(callback);
    }
  }
  
  return temp;
};
I/O例:
let root1 = new TreeMaker(1); // root1 === { value: 1, children: [] }
let branch2 = root1.addChild(2); 
// root1 === { value: 1, children: [{ value: 2, children: [] }] }
// branch2 === { value: 2, children: [] }
let branch3 = root1.addChild(3);
// root1 === { value: 1, children: [{ value: 2, children: [] }, { value: 3, children: [] }] }
// branch3 === { value: 3, children: [] }

難しい理由は?


解が終わってから見ると難しくはありませんが、解の時は実は難しいです.Data Structure sprintはちょっと難しいと思うので、問題が終わったら全部削除して3~4回以上やります.資料の構造についての問題が出ることを知っているので、資料の構造の上で弱い私ができることは最大限に問題を繰り返し解いて、このような感じを私の体に吸収することです.このように繰り返し解答して、hash tableのような問題は、実際には多くの時間をかけて解答して、最後に問題を解く時に手に入れました.
この問題は難しいというよりは条件がある(例えばmapメソッドでは元を置いてコールバック関数を適用した新しいオブジェクトを作成するなど).幸いなことに、この問題のマッピング方法は、Data Structure Sprintの第3部の2元検索ツリーの問題と同様に役立ちます.
私がmap方法を実現する方法はこうです.まず、新しいオブジェクトを作成します.すなわち、条件の1つであるソースオブジェクトをコピーしますが、TreeMaker関数のインスタンスである必要があります.そのため、TreeMaker関数でnewキーを使用してtempオブジェクトを作成し、その値でソースオブジェクトのvalueにコールバック関数の値を割り当てます.このように、元のオブジェクトの値が1であり、コールバック関数が値を2倍にすると、新しく作成されたオブジェクトtempの値は2になります.
次に,サブノードにコールバック関数を適用してtempのサブノードとしなければならないため,for文を用いてサブノードにアクセスし,コールバック関数を適用する値をtempのサブノードとして順次適用する.これにより、1番目の条件「カテゴリに触れない」と2番目の条件「TreeMaker」のインスタンスと、カテゴリオブジェクトにコールバック関数を適用する値を返すことができます.

2. Reference

const TreeMaker = function (value) {
  this.value = value;
  this.children = [];
};

TreeMaker.prototype.addChild = function(child) {
  if (!child || !(child instanceof TreeMaker)) {
    child = new TreeMaker(child)
  }

  this.children.push(child)

  return this
};

TreeMaker.prototype.map = function(callback) {
  return this.children.reduce(function (tree, child) {
    return tree.addChild(child.map(callback))
  }, new TreeMaker(callback(this.value)))
};

3. Feedback


リファレンスコードは非常に簡潔でクリエイティブな方法で解決されました.正直に言うと、私は配列問題をするときにmap、filter、reduceなどの方法をよく使うわけではありません.FreeCosの時はCOPLETかHAのためにたくさん書かなければならなくて、勉強も頑張ったことがありますが、FreeCosの後では実は何の役にも立たないと思って、書かないとますます見慣れなくなりました.しかし,参照コードから見るとmapとreduceを用いた方が簡単にいくつかの問題を解決したようなので,今後配列問題が発生したらこれらの方法を用いることにした.