이진탐색트리: BST, Binary Search Tree로 이진트리 기반의 효율적인 탐색 작업을 위한 자료구조이다.
이진탐색트리의 정의
탐색 방법
삽입 방법
삽입 알고리즘
insert (root, n)
if KEY(n) = KEY(root) // root와 키가 같으면
then return; // return
else if KEY(n) < KEY(root) then // root보다 키가 작으면
if LEFT(root) = NULL // root의 왼쪽 자식이
then LEFT(root) ← n; // 없으면 n이 왼쪽 자식
else insert(LEFT(root),n); // 있으면 순환 호출
else // root보다 키가 크면
if RIGHT(root) = NULL
then RIGHT(root) ← n;
else insert(RIGHT(root),n);
삭제 방법 case1: 단말 노드 삭제
삭제 방법 case2: 자식이 하나인 노드 삭제
삭제 방법 case3: 두 개의 자식을 가진 노드 삭제
class Solution {
public:
bool isValid(TreeNode* root, TreeNode* low, TreeNode* high) {
if(!root) return true;
if(low && root->val <= low->val) return false;
if(high && root->val >= high->val) return false;
return isValid(root->right, root, high) && isValid(root->left, low, root);
}
bool isValidBST(TreeNode* root) {
return isValid(root, nullptr, nullptr);
}
};
class Solution {
public:
vector<int> val;
int first, second;
void InorderTraversal(TreeNode* root){
if(root==NULL){
return;
}
InorderTraversal(root->left);
val.push_back(root->val);
InorderTraversal(root->right);
}
void changeValTree(TreeNode *root){
if(root==NULL){
return;
}
changeValTree(root->left);
if((root->val)==first){
(root->val) = second;
}else if((root->val)==second){
(root->val) = first;
}
changeValTree(root->right);
}
void recoverTree(TreeNode* root) {
InorderTraversal(root);
int prev = val[0];
first = NULL, second = NULL;
for(int i=1; i<val.size(); i++){
if(prev>val[i] && first==NULL){
first = prev;
}
if(prev>val[i] && first!=NULL){
second = val[i];
}
prev = val[i];
}
changeValTree(root);
}
};
class Solution {
public:
TreeNode* serchBST(TreeNode* root, int val) {
if(root == NULL) {
return NULL;
}
if(root->val == val) {
return root;
}
else if(root->val < val) {
if(root->right == NULL) return NULL;
return serchBST(root->right, val);
}
else {
if(root->left == NULL) return NULL;
return serchBST(root->left, val);
}
}
};
public TreeNode insertIntoBST(TreeNode root, int val) {
if(root==null) return new TreeNode(val);
if(root.val > val){
root.left = insertIntoBST(root.left,val);
}else{
root.right = insertIntoBST(root.right,val);
}
return root;
}