노드로 구성된 계층적 자료구조.
노드(node)들과 노드들을 연결하는 간선(edge)들로 구성되어 있다.
트리는 1개 이상의 노드로 구성되며, 하나의 루트 노드를 갖는다.
최상위 노드인 루트는 0개 이상의 자식 노드를 갖는다.
그 자식 노드의 자식 노드가 존재하는 구조가 반복된다.
트리는 루트와 전체 트리의 부속트리로 구성된다고 말할 수 있다.
최소 연결 트리
라고도 불린다.하나의 부모가 가질 수 있는 자식의 수가 최대 2개인 트리를 말한다.
모든 트리가 이진트리는 아니다.
3 4
/ \ \
1 2 5
2^(height-1)
.2^3-1 = 7
개의 노드를 갖는다. a
/ \
b c
/ \ / \
d e f g
n < 2^height-1
. a
/ \
b c
/ \ /
d e f
a a
/ \
b b
/ \
d d
왼쪽 편향 오른쪽 편향
a
/ \
b c
/ \
d e
새로운 노드를 추가할 경우 부모 노드보다 값이 작으면 부모의 왼쪽자식, 부모 노드보다 값이 크면 부모의 오른쪽 자식에 노드를 추가한다.
모든 왼쪽 자식들 <= N < 모든 오른쪽 자식들 (모든 노드 N에 대해서 반드시 true)
구현의 핵심은, 부모 노드에 자식과의 관계(주소)를 어떻게 저장할 것인가 에 대한 답에서 나온다.
배열을 사용하면 된다.
배열에 자식 노드들의 주소를 담아준다.
자식 노드를 생성하고 배열에 담으면, 자바스크립트가 알아서 주소를 맵핑해 준다.
자식을 삭제하기 위해서는 배열에서 해당 요소만 제거해주면 된다.
class Tree {
//tree의 constructor를 구현.
//tree의 자식 노드들을 children으로 할당하여 노드의 자식 노드들을 담을 수 있게 한다.
constructor(value) {
this.value = value;
this.children = [];
}
//tree의 자식 노드를 생성 한 후에, 노드의 children에 push해준다.
insertNode(value) {
const childNode = new Tree(value);
this.children.push(childNode);
}
// tree에서 value값을 탐색.
// 현재 노드의 value 값이 찾는 값과 일치한다면 return.
contains(value) {
if (this.value === value) {
return true;
}
// 노드가 가진 자식 노드를 순회하는 반복문으로 노드의 children 배열을 탐색한다.
for (let i = 0; i < this.children.length; i += 1) {
const childNode = this.children[i];
if (childNode.contains(value)) {
return true;
}
}
return false;
}
}