algorithm/자료구조
remove : 이진탐색트리(Binary Search Tree, BST)
yongfront
2024. 2. 25. 11:31
반응형
SMALL
이진탐색트리(Binary Search Tree, BST)에서 remove 메소드를 구현하는 것은 조금 더 복잡합니다. 노드를 제거할 때는 세 가지 주요 상황을 고려해야 합니다:
- 리프 노드 제거: 제거하려는 노드가 리프 노드인 경우, 단순히 그 노드를 제거하면 됩니다.
- 한 개의 자식을 가진 노드 제거: 제거하려는 노드가 하나의 자식만 가지고 있는 경우, 그 노드를 제거하고, 그 자식을 제거된 노드의 부모 노드에 연결합니다.
- 두 개의 자식을 가진 노드 제거: 제거하려는 노드가 두 개의 자식을 가지고 있는 경우, 노드의 오른쪽 서브트리에서 가장 작은 값을 찾거나(또는 왼쪽 서브트리에서 가장 큰 값을 찾아) 그 값을 제거하려는 노드의 위치로 이동하고, 원래 그 값을 가지고 있던 노드를 제거합니다.
아래는 BST 클래스에 remove 메소드를 추가한 예시입니다. 이 예시는 노드를 제거하는 기본적인 로직을 구현합니다:
class Node {
constructor(data, left = null, right = null) {
this.data = data;
this.left = left;
this.right = right;
}
}
class BST {
constructor() {
this.root = null;
}
// insert 메소드는 이전 예시와 동일하게 유지됩니다.
// ...
remove(data) {
const removeNode = function(node, data) {
if (node == null) {
return null;
}
if (data == node.data) {
// 노드가 자식을 가지고 있지 않은 경우
if (node.left == null && node.right == null) {
return null;
}
// 노드가 하나의 자식만 가지고 있는 경우
if (node.left == null) {
return node.right;
}
if (node.right == null) {
return node.left;
}
// 노드가 두 개의 자식을 가지고 있는 경우
let tempNode = node.right;
while (tempNode.left !== null) {
tempNode = tempNode.left;
}
node.data = tempNode.data;
node.right = removeNode(node.right, tempNode.data);
return node;
} else if (data < node.data) {
node.left = removeNode(node.left, data);
return node;
} else {
node.right = removeNode(node.right, data);
return node;
}
};
this.root = removeNode(this.root, data);
}
}
이 코드는 removeNode 함수를 재귀적으로 사용하여 트리에서 노드를 제거합니다. 제거 로직은 앞서 설명한 세 가지 경우를 처리합니다. 특히, 두 개의 자식을 가진 노드를 제거할 때는 오른쪽 서브트리에서 가장 작은 값을 찾아 그 값을 제거하려는 노드로 이동시키는 방법을 사용합니다. 그리고 나서, 원래 그 값을 가지고 있던 노드(이제는 빈 자리)를 재귀적으로 제거합니다.
remove 메소드의 구현은 이진탐색트리의 성질을 유지하면서 특정 노드를 안전하게 제거할 수 있게 해줍니다. 이 과정에서 트리의 구조가 변경될 수 있으므로, 트리의 균형을 유지하기 위한 추가 작업이 필요할 수 있습니다.
728x90
반응형
LIST