상속관계가 위와 같은 트리가 있다고 가정하면
상속관계는 아래와 같이 표기할 수 있다.
이때 최상위 부모인 A는 부모가 없으므로 부모 정보에 null을 표기했다.
//[parentName, myName]
const relations = [
[null, "A"],
["A", "B"],
["A", "C"],
["B", "D"],
["B", "E"],
["C", "F"],
];
트리 노드 만들기
이후 상속 정보가 담긴 relation을 순회하면서 노드를 만든다.
myName으로 만들어진 노드가 없다면 노드를 만들고,
parentName가 null이 아닌 경우를 제외하고 parentName으로 만들어진 노드가 없다면 노드를 만들고,
parentName노드 자식 리스트에 myName 노드를 추가한다.
이렇게 완성된 트리노드는 아래와 같다.
function createNode(relations) {
const nodes = {};
relations.forEach(([parentName, myName]) => {
if (!nodes[myName]) {
nodes[myName] = { name: myName, children: [] };
}
if (parentName) {
if (!nodes[parentName]) {
nodes[parentName] = { name: parentName, children: [] };
}
nodes[parentName].children.push(nodes[myName]);
}
});
console.log(nodes);
}
{
A: { name: 'A', children: [ [Object], [Object] ] },
B: { name: 'B', children: [ [Object], [Object] ] },
C: { name: 'C', children: [ [Object] ] },
D: { name: 'D', children: [] },
E: { name: 'E', children: [] },
F: { name: 'F', children: [] }
}
트리 노드를 xml 형태로 출력하기
노드를 완성한 이후에는 최상위 노드를 찾은 뒤,
최상위 노드를 printNode 함수에 인수로 넘긴다.
printNode 함수는 노드를 출력한 뒤, 그 노드의 자식을 인수로 재귀적으로 호출된다.
const root = nodes[relations.find(([parentName]) => parentName === null)[1]]; //최상위 노드 탐색
printNode(root);
function printNode(node, depth = 0) {
const indents = " ".repeat(depth);
console.log(`${indents}<${node.name}>`);
node.children.forEach((child) => printNode(child, depth + 1)); //재귀함수로 자식 출력
console.log(`${indents}</${node.name}>`);
}
코드 전문 & 실행 결과
const relations = [
[null, "A"],
["A", "B"],
["A", "C"],
["B", "D"],
["B", "E"],
["C", "F"],
];
function createNode(relations) {
const nodes = {};
relations.forEach(([parentName, myName]) => {
if (!nodes[myName]) {
nodes[myName] = { name: myName, children: [] };
}
if (parentName) {
if (!nodes[parentName]) {
nodes[parentName] = { name: parentName, children: [] };
}
nodes[parentName].children.push(nodes[myName]);
}
});
const root = nodes[relations.find(([parentName]) => parentName === null)[1]];
printNode(root);
}
function printNode(node, depth = 0) {
const indents = " ".repeat(depth);
console.log(`${indents}<${node.name}>`);
node.children.forEach((child) => printNode(child, depth + 1));
console.log(`${indents}</${node.name}>`);
}
createNode(relations);
<A>
<B>
<D>
</D>
<E>
</E>
</B>
<C>
<F>
</F>
</C>
</A>
'ALGORITHM' 카테고리의 다른 글
(Algorithm/Javascript) stack이란? 자바스크립트로 stack구현하기 (0) | 2024.07.02 |
---|---|
(백준/구름) 자바스크립트로 입력 출력 받기, 백준/구름 세팅하기, 입력 유형별 코드 정리 (0) | 2024.06.14 |
(Algorithm) 알고리즘, 문제해결 패턴, 빈도 수 세기 패턴, Frequency Counter (0) | 2024.06.03 |