
강의 출처

하나의
노드에서 여러가지의 나뭇가지로 가지치기 하며내려가는것 = "계층구조"를 표현하기에 제격이다.

참고로, 터미널노드는
루트노드만 있는 트리로 볼 수 있음

A인 입장에선, 3개의 서브트리가 연결된 구조Tree에서 어떤 규칙을 지켜야지 Binary Tree라고 불리운다.자식노드가 최대 "2개" 만 가져야지 이진트리이다.

트리의 최대 레벨에 있는 모든 터미널 노드가, 꽉 찬 트리
예 ) 트리 높이가 3이며, 레벨3에 있는 노드(=터미널노드)들이 꽉 차있으므로 노드 추가가 불가한 상태

만약, 터미널노드가 꽉 차있지 않으면? 노드 추가 가능


질문, 이 트리는 "완전 이진 트리" 일까요?
답은 ❌ 레벨2 노드가 꽉 채워져 있지 않음
답은 ❌ 레벨2까지는 모두 채워져 있지만, 레벨3에서 왼쪽부터 채워져 있지 않아서 완전 이진 트리가 아님.
ADT 즉,추상 자료형을 정의 해보겠다. class BinaryTree {
constructor(data, leftTree = null, rightTree = null) {
(this.data = data),
(this.leftSubTree = leftTree),
(this.rightSubTree = rightTree);
}
}
노드를 1개만 만든 이유
- 이진트리는 노드이면서 트리이기 때문!
- 노드2는 노드1의 서브트리
- 노드3은 노드1의 서브트리
getData() {
return this.data;
}
setData(data) {
this.data = data;
}
getLeftSubTree() {
return this.leftSubTree;
}
getRightSubTree() {
return this.rightSubTree;
}
setLeftSubTree(tree) {
this.leftSubTree = tree;
}
setRightTree(tree) {
this.rightSubTree = tree;
}
test_binaryTree.mjs파일을 만들었다.
//1. 7개의 노드(트리)만들기
let tree1 = BinaryTree(1);
let tree2 = BinaryTree(2);
let tree3 = BinaryTree(3);
let tree4 = BinaryTree(4);
let tree5 = BinaryTree(5);
let tree6 = BinaryTree(6);
let tree7 = BinaryTree(7);
//2. 연결하기
tree1.setLeftSubTree(tree2);
tree1.setRightSubTree(tree3);
tree2.setLeftSubTree(tree4);
tree2.setRightSubTree(tree5);
tree3.setLeftSubTree(tree6);
tree3.setRightSubTree(tree7);
//3. 트리 출력하기
console.log("루트노드의 오른쪽 자식 : " + tree1.getRightSubTree().getData());
console.log(
"루트도의 오른쪽 자식의, 왼쪽 노드 : " +
tree1.getRightSubTree().getLeftSubTree().getData()
);

만약, 트리 '전체'를 출력하려면 하나씩 다 '수동'으로 입력하기?
너무 힘들고 귀찮다.
그러니 트리 '전체'를 출력하는 기능 을 구현하기 !

높이가 2 인 트리는 전위순회+중위순회+후위순회로 전부 출력 할 수 있다. 만약
높이가 7인 트리를 중위 순회 하자면 ?
이미지 처럼 모든 노드가 재귀적으로 출력 되어야 함.

// 전위순회
preOrderTraversal(tree) {
//기저조건
if (tree == null) return;
//1. 노드호출
console.log(tree.data);
//2. 왼쪽 호출
this.preOrderTraversal(tree.getLeftSubTree());
//3. 오른쪽 호출
this.preOrderTraversal(tree.getRightSubTree());
}
//* 전위순회 호출
console.log("전위 순회 호출");
tree1.preOrderTraversal(tree1);
//* 중위순회 호출
console.log("중위 순회 호출 ");
tree1.inorderTraversal(tree1);
//* 후후위순회 호출
console.log("후위 순회 호출 ");
tree1.postorderTraversal(tree1);

포화 이진 트리: 모든 노드가 0개 또는 2개의 자식을 가지고, 모든 층이 꽉 채워져 있는 트리.
완전 이진 트리: 마지막 레벨을 제외한 모든 레벨이 완전히 채워져 있고, 마지막 레벨의 노드가 왼쪽부터 순서대로 채워진 트리.