- 트리를 구성하는 Node 중 하나의 Node 객체를 입력받아서 해당노드를 시작으로 DFS를 한다. 탐색되는 순서대로 저장된 배열을 리턴한다.
- node.value(number 타입), node.children(Node를 요소로 갖는 배열)
- 아래와 같이 value를 입력받아 그 자식노드들을 트리 형태로 만들었다.
let dfs = (node) => {
}
let Node = (value) => {
this.value = value;
this.children = [];
}
Node.prototype.addChild = (child) => {
this.children.push(child);
return child;
}
- 예시를 통해 알아보면 다음과 같다.
- 아래와 같이 노드들을 생성했을 경우 그림과 같은 형태로 노드들이 생성된다.
let root = new Node(1);
let rootChild1 = root.addChild(new Node(2));
let rootChild2 = root.addChild(new Node(3));
let leaf1 = rootChild1.addChild(new Node(4));
let leaf2 = rootChild1.addChild(new Node(5));

- 그럼 최종적으로 [1, 2, 4, 5, 3]의 형태로 출력되게 만들어줘야한다.
- checkNode 함수를 통해서 node.children이 있는 경우 result변수에 node.value를 한 다음 for문으로 재귀적으로 탐색해준다. 따라서 결국 node.children이 있는 경우에는 부모노드의 다음 인덱스로 result에 담기게 된다.
let dfs = (node) => {
// 최종적으로 출력해줄 배열 변수가 필요하다.
let result = [];
// 자식노드가 있는지 확인하기 위해서 재귀적으로 돌려줘야한다.
let checkNode = (node) => {
// node.children 있는지 확인한다.
if(node.children) {
// 값이 있으면 node.value를 result 배열에 넣어준다.
result.push(node.value);
// 자식이 있으니까 for문으로 node.children의 길이만큼 탐색해서 재귀적으로 돌려줘야한다.
for(let i=0; i<node.children.length; i++) {
// i번째 요소를 재귀적으로 계속 보낸다.
checkNode(node.children[i]);
}
} else {
// node.children이 없는 경우에도 그냥 result에 node.value를 넣어준다.
result.push(node.value);
}
}
// checkNode를 호출해준다.
checkNode(node);
// 최종 result 변수를 리턴한다.
return result;
}
let Node = (value) => {
this.value = value;
this.children = [];
}
Node.prototype.addChild = (child) => {
this.children.push(child);
return child;
}
let dfs = (node) => {
// 최종적으로 출력해줄 배열 변수가 필요하다.
let result = [node.value];
// node.children 탐색
node.children.forEach(el => {
result = result.concat(dfs(el));
});
// 최종 result 변수를 리턴한다.
return result;
}
let Node = (value) => {
this.value = value;
this.children = [];
}
Node.prototype.addChild = (child) => {
this.children.push(child);
return child;
}