일반적인 트리를 전위순회하는 알고리즘 만드시오.

트리의 자식은 여러개일 수 있다.

제공한 코드:

// 이 아래 코드는 변경하지 않아도 됩니다. 자유롭게 참고하세요. 
//{value: xx, children: []}, addchild라는 메소드가 있다.(배열에 요소 추가하고 추가한 아이반환)
let Node = function (value) { //클래스 선언. 인스턴스도 new Node로 만들수있다.
  this.value = value;
  this.children = [];
};

// 위 Node 객체로 구성되는 트리는 매우 단순한 형태의 트리입니다.
// membership check(중복 확인)를 따로 하지 않습니다.
Node.prototype.addChild = function (child) {
  this.children.push(child);
  return child;
};

내가 작성한 코드

let dfs = function (node) {
  // TODO: 여기에 코드를 작성합니다.
  //value 값이 없으면 빈 배열리턴
  if(node.value === undefined) return [];
  //결과를 저장할 배열 선언
  const result = [];
  //이 안에서 재귀함수 사용.
  //childen은 몇개가 있는지 모르는데..0개일수도, 1개일수도, 2개일수도 있어.
  //순서
  //부모부터(node) 먼저 임시 배열에 담는다.
  //자식이 있을 경우,배열의 요소를 하나씩 순회한다.
    //요소에 또 자식이 있다면(children[i].children이 존재), value푸시하고, 그것의 자식을 또 순회한다..재귀
    //자식이 없다면 value만 푸시하고, 탐색 종료한다.
  //자식이 없을 때는 탐색 종료
  function traversal(start){//start는 시작할 지점. 객체 형태로 주어진다 {value: xx, children: []}
    result.push(start.value);//시작 지점의 value 속성을 넣는다. 
    //children이 있을 경우, children을 순회해야한다.
    if(start.children.length){  
      for(let i = 0; i < start.children.length; i++){ //{value: xx, children: [{value: 11, children: []},{value: 23, children: []},..]}
        traversal(start.children[i]);
      }
    }
  }
  traversal(node);
  return result;
};

입출력 예시를 보아, 전위순회임을 파악하였음. 전위순회의 원리를 이해해야 풀 수 있는 문제였다.

레퍼런스 코드에서는 헬퍼함수없이 순수 재귀만을 사용하였다.

해당 레퍼런스 코드는 다음과 같다.(재귀 코플릿 14번과 동일한 해결 패턴)

let dfs = function(node){
  let result = [node.value] //일단 방문한 노드는 무조건 넣는다
	node.children.forEach(n => { //자식이 있을때만 실행되는 거라 없을때의 처리방법은 안적어도됨
		result = result.concat(dfs(n)) 
		//재귀함수의 리턴값이 배열이라 concat사용함.
	})
	return result;
}