struct Node {
Node* parent = nullptr;
Node* left = nullptr;
Node* right = nullptr;
int key = 0;
};
parent: 부모 노드를 가리킴.left: 왼쪽 자식 노드를 가리킴.right: 오른쪽 자식 노드를 가리킴.key: 노드에 저장된 값.class BinarySearchTree {
public:
void Insert(int key);
void Delete(int key);
Node* Search(Node* node, int key);
Node* Min(Node* node);
Node* Max(Node* node);
Node* Next(Node* node);
void Replace(Node* u, Node* v);
private:
Node* _root = nullptr;
};
Insert: 새로운 값을 삽입.Delete: 특정 값을 삭제.Search: 특정 키를 검색.Min, Max: 최소값, 최대값 검색.Next: 특정 노드의 다음 노드(중위 순회 기준) 검색.Replace: 두 노드를 교체.새로운 값을 트리에 삽입합니다.
void BinarySearchTree::Insert(int key) {
Node* newNode = new Node();
newNode->key = key;
if (_root == nullptr) {
_root = newNode;
return;
}
Node* node = _root;
Node* parent = nullptr;
while (node) {
parent = node;
if (key < node->key) {
node = node->left;
} else {
node = node->right;
}
}
newNode->parent = parent;
if (key < parent->key) {
parent->left = newNode;
} else {
parent->right = newNode;
}
}
특정 키를 가진 노드를 검색합니다.
Node* BinarySearchTree::Search(Node* node, int key) {
if (node == nullptr || key == node->key) {
return node;
}
if (key < node->key) {
return Search(node->left, key);
} else {
return Search(node->right, key);
}
}
Node* BinarySearchTree::Min(Node* node) {
while (node->left) {
node = node->left;
}
return node;
}
Node* BinarySearchTree::Max(Node* node) {
while (node->right) {
node = node->right;
}
return node;
}
Node* BinarySearchTree::Next(Node* node) {
if (node->right) {
return Min(node->right);
}
Node* parent = node->parent;
while (parent && node == parent->right) {
node = parent;
parent = parent->parent;
}
return parent;
}
void BinarySearchTree::Delete(Node* node) {
if (node == nullptr) return;
if (node->left == nullptr) {
Replace(node, node->right);
} else if (node->right == nullptr) {
Replace(node, node->left);
} else {
Node* next = Next(node);
node->key = next->key;
Delete(next);
}
}
void BinarySearchTree::Replace(Node* u, Node* v) {
if (u->parent == nullptr) {
_root = v;
} else if (u == u->parent->left) {
u->parent->left = v;
} else {
u->parent->right = v;
}
if (v != nullptr) {
v->parent = u->parent;
}
}
u를 v로 대체.| 연산 | 평균 시간 복잡도 | 최악의 시간 복잡도 |
|---|---|---|
| 탐색 | O(log N) | O(N) |
| 삽입 | O(log N) | O(N) |
| 삭제 | O(log N) | O(N) |
| 특징 | 이진 트리 | 이진 탐색 트리 |
|---|---|---|
| 정렬 | 데이터 정렬되지 않음 | 데이터가 정렬된 순서로 저장 |
| 탐색 효율성 | O(N) | O(log N) |
| 데이터 추가 규칙 | 없음 | 왼쪽: 작음, 오른쪽: 큼 |
| 용도 | 다양한 트리 기반 알고리즘 구현에 사용 | 데이터 저장 및 검색 용도로 사용 |