일반적인 트리를 전위순회하는 알고리즘 만드시오.
트리의 자식은 여러개일 수 있다.
제공한 코드:
// 이 아래 코드는 변경하지 않아도 됩니다. 자유롭게 참고하세요.
//{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;
}