강의 출처
이 링크를 통해 구매하시면 제가 수익을 받을 수 있어요. 🤗
그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
인프런 강의 - 그림으로 쉽게 배우는 자료구조와 알고리즘 (심화편)
인프런 강의 - 만들면서 쉽게 배우는 컴퓨터 구조



이진 탐색 트리 조건을 무너뜨리지 않는 조건으로 노드가 와야함.
8을 부모노드로 올릴 예정 

8이 나왔음 ) 8을 10노드 위치로 올려야한다. 
8의 자식노드인 7을 연결해주기. removeLeftSubTree() {
//제거하는 노드는 변수로 반환 필요
let deletingNode = this.getLeftSubTree();
//그리고 왼쪽 자식노드를 null로 설정해서 끊어내기
this.getLeftSubTree(null);
//제거된 노드는 리턴하기
return deletingNode;
}
removeRightSubTree() {
//제거하려는 노드는 변수로 반환 필요, 선택 해야하니깐
let deletingNode = this.getRightSubTree();
this.getRightSubTree(null);
return deletingNode;
}
remove(targetData) {
let fakeParentRootNode = new BinarySearchTree(0);
}
targetData로 설정fakeParentRootNode 초기값은0으로 설정. let parentNode = fakeParentRootNode;
let currentNode = this.root;
let deletingNode = null;
parentNode는 현재 root노드의 가짜 부모로 설정 root에서 시작함. deletingNode는 현재 비어있음. while (currentNode != null && currentNode.getData() != targetData) {
parentNode = currentNode;
if (currentNode.getData() > targetData) {
currentNode = currentNode.getLeftSubTree();
} else {
currentNode = currentNode.getRightSubTree();
}
}
if (currentNode == null) {
return;
}
while문 : 현재노드가 존재하고, 제거할 데이터가 존재한다면? 좌/우로 이동 타겟값보다 크다면, 왼쪽으로 내려가기 타겟값보다 작다면, 오른쪽으로 내려가기 null로 비워주고 나가기.
currentNode = deletingNode로 초기화 시키기if (
deletingNode.getLeftSubTree() == null &&
deletingNode.getRightSubTree() == null
)
deletingNode가 부모노드에서 어디 위치하는지 확인 remove해서 끊어주기 

else if (
deletingNode.getLeftSubTree() == null ||
deletingNode.getRightSubTree() == null
) {
}
deletingNode의 왼쪽이나 오른쪽 중에 자식노드가 1개만 있다면 ? let deletingNodeChild = null;
if (deletingNode.getLeftSubTree() != null) {
deletingNodeChild = deletingNode.getLeftSubTree();
} else {
deletingNodeChild = deletingNode.getRightSubTree();
}
deletingNodeChilddeletingNodeChild에 제거하는 노드의 자식노드가 저장되어 있음.if (parentNode.getLeftSubTree() == deletingNode) {
parentNode.setLeftSubTree(deletingNodeChild);
} else {
parentNode.setRightSubTree(deletingNodeChild);
}
8의 부모노드(= parentNode) 와 8의 자식노드(=deletingNodeChild)를 연결 해주면 끝이다 ! 8)가 부모노드의 오른쪽에 있다면? 이 비어있는 자리를 자식노드가 (deletingNodeChild)로 세팅해줘야한다. 
10을 제거하는 경우, 왼쪽 트리에서 가장 큰 노드로 대체해야함.
< 기본 >
8이 대체되었으니, 8자리에는 8의 자식인 7이 6의 오른쪽 노드로 와줘야함.10 노드를 제거 10의 자리에 8 노드 연결15의 왼쪽 자식을 8노드 연결 + 8의 왼쪽 자식으로 6 연결 + 8의 오른쪽 자식으로 12연결< 대체 >
10노드를 제거하는 것 보다 8노드로 값을 변경해주면 번거롭게 연결하지 않아도 된다.8이 대체되었으니, 8자리에는 8의 자식인 7이 6의 오른쪽 노드로 와줘야함.10노드의 값을 8로 변경 ( 이렇게 하면, 10노드를 제거하느라 연결을 끓을 필요가 없음 )