Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- IAC
- leetcode
- 쿠버네티스
- Service
- 자바스크립트
- EC2
- elasticsearch
- DevOps
- github
- terraform
- asyncio
- WSGI
- AWS
- ebs
- ansible
- IAM
- POD
- YAML
- FastAPI
- Django
- intervals
- asgi
- Kubernetes
- dockerfile
- Deployment
- Python
- event loop
- EKS
- docker
- K8S
Archives
- Today
- Total
궁금한게 많은 개발자 노트
[ leetcode ] 450. Delete Node in a BST 본문
Binary Search Tree가 주어졌을 때, 한 노드를 제거하고 재배치한 BST를 반환하는 문제입니다.
여러 경우의 수가 있지만, 우선 한 노드를 삭제할 때 기본적인 규칙은 다음과 같습니다.
- 삭제할 노드의 자식 중 한쪽 노드만 존재하는 경우, 삭제할 노드 위치를 해당 노드로 변경
- 삭제할 노드의 자식 둘 다 존재하는 경우, 왼쪽 자식 노드를 삭제할 노드로 대체한다고 하면 왼쪽 자식 노드의 오른쪽 노드를
삭제할 노드의 오른쪽 자식의 가장 왼쪽 자식에 추가해주는 로직이 필요 (반대의 경우도 가능)
아래 링크를 참고하면 이해에 도움이 될 것 같습니다.
https://leetcode.com/problems/delete-node-in-a-bst/solutions/1591176/c-simple-solution-w-images-detailed-explanation-iterative-recursive-approach/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void delete_current_node(TreeNode*& current, TreeNode*& parent) {
if (current->left) {
if (current->right) {
TreeNode* temp = current->right;
while (temp->left) temp = temp->left;
temp->left = current->left->right;
current->left->right = current->right;
}
if (parent->left == current) parent->left = current->left;
else if (parent->right == current) parent->right = current->left;
else parent = parent->left;
}
else if (current->right) {
if (current->left) {
TreeNode* temp = current->left;
while (temp->right) temp = temp->right;
temp->right = current->right->left;
current->right->left = current->left;
}
if (parent->left == current) parent->left = current->right;
else if (parent->right == current) parent->right = current->right;
else parent = parent->right;
}
else {
if (parent->left == current) parent->left = NULL;
else if (parent->right == current) parent->right = NULL;
else parent = NULL;
}
}
pair<TreeNode*, TreeNode*> findNode(TreeNode* current, TreeNode* parent, int key) {
if (!current) return make_pair(nullptr, nullptr);
if (current->val > key) return findNode(current->left, current, key);
else if (current->val < key) return findNode(current->right, current, key);
else return make_pair(current, parent);
}
TreeNode* deleteNode(TreeNode* root, int key) {
if (!root) return NULL;
pair<TreeNode*, TreeNode*> delete_node;
if (root->val > key) delete_node = findNode(root->left, root, key);
else if (root->val < key) delete_node = findNode(root->right, root, key);
else delete_current_node(root, root);
if (delete_node.first != nullptr) delete_current_node(delete_node.first, delete_node.second);
return root;
}
};
'Algorithm' 카테고리의 다른 글
[ leetcode ] 78. Subsets (0) | 2023.05.02 |
---|---|
[ leetcode ] 57. Insert Interval (0) | 2023.05.02 |
[ leetcode ] 11. Container With Most Water (0) | 2023.05.02 |
[ leetcode ] 102. Binary Tree Level Order Traversal (0) | 2023.05.02 |
[ leetcode ] 110. Balanced Binary Tree (0) | 2023.05.02 |
Comments