오늘의 학습 키워드
공부한 내용 본인의 언어로 정리하기
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
// 기본 케이스: 트리가 비어있거나 찾는 값을 발견했을 때
if(root == null || root.val == val){
return root;
}
// val이 현재 노드의 값보다 작으면 왼쪽 서브트리에서 검색
if(val < root.val){
return searchBST(root.left, val);
}
// val이 현재 노드의 값보다 크면 오른쪽 서브트리에서 검색
return searchBST(root.right, val);
}
}
오늘의 회고
오늘은 이분탐색을 주제로 문제나 나왔다. 문제를 풀기 전 문제에 대해서 이해하기 위해서 Binary Search Tree에 대해 먼저 조사했다.
이진 탐색 트리는 다음과 같은 특성을 가진 노드들의 집합이다.
노드의 개념과 작동 원리
노드는 데이터 구조에서 데이터를 저장하는 기본 단위이다. 각 노드는 두 가지 주요 요소를 가진다.
노드는 다음과 같이 작동된다
이진 탐색 트리의 주요 연산
a. 노드 생성 및 삽입
TreeNode root = new TreeNode(4);
root.left = new TreeNode(2);
root.right = new TreeNode(7);
root.left.left = new TreeNode(1);
root.left.right = new TreeNode(3);
b. 트리 탐색 (예: 값 검색)
public TreeNode searchBST(TreeNode root, int val) {
if (root == null || root.val == val) {
return root;
}
if (val < root.val) {
return searchBST(root.left, val);
}
return searchBST(root.right, val);
}
c. 트리 순회
// 중위 순회 (오름차순으로 값을 출력)
void inorderTraversal(TreeNode node) {
if (node != null) {
inorderTraversal(node.left);
System.out.print(node.val + " ");
inorderTraversal(node.right);
}
}
설명을 보면서 노드에 대해서도 이해를 하지 못해서 추가로 더 조사하였다.
노드(Node)란?
노드는 데이터를 저장하는 상자라고 생각하고 이 상자 안에는 두 가지가 들어있다
값: 우리가 저장하고 싶은 정보 (예: 숫자, 이름 등)
화살표: 다른 상자를 가리키는 표시
코드는 트리 탐색을 가지고 하면 될거 같아 그대로 RUN을 돌렸는데 ACCEPT가 나왔고 어떤 상황에서 어떻게 작동을 하는지에 대해 추가로 주석을 달면서 조금이나마 이해하려고 노력했다.
AI 코드리뷰
현재 코드의 장점
현재 코드의 단점
시간 복잡도
1번 (반복문을 사용한 버전)
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
while (root != null && root.val != val) {
root = val < root.val ? root.left : root.right;
}
return root;
}
}
개선된 버전의 장점:
시간 복잡도는 여전히 동일합니다:
2번 (균형 잡힌 BST를 가정한 버전)
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if (root == null || root.val == val) return root;
TreeNode current = root;
while (current != null) {
if (val == current.val) return current;
if (val < current.val) {
if (current.left == null) return null;
current = current.left;
} else {
if (current.right == null) return null;
current = current.right;
}
}
return null;
}
}
개선된 버전의 장점:
이 버전의 시간 복잡도:
두 번째 개선된 버전은 BST가 어느 정도 균형을 유지하고 있다고 가정할 때 더 효율적입니다. 또한, 노드의 자식 존재 여부를 확인함으로써 불필요한 null 체크를 줄이고, 트리의 끝에 도달했을 때 빠르게 null을 반환할 수 있습니다.
내일 공부할 것 :
이진 탐색 트리와 관련된 CS 지식을 더 깊이 이해하기 위해 추가로 학습해야 할 것 같다.
기본 데이터 구조
트리 구조의 확장
그래프
알고리즘 기초
프로그래밍 패러다임
문제
https://leetcode.com/problems/search-in-a-binary-search-tree/