[LeetCode] Validate Binary Search Tree

2025. 3. 1. 15:11·공부/코딩테스트 | 알고리즘

문제

Given the root of a binary tree, determine if it is a valid binary search tree (BST).

A valid BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

예시

example1

Input: root = [2,1,3]
Output: true

example2

Input: root = [5,1,4,null,null,3,6]
Output: false
Explanation: The root node's value is 5 but its right child's value is 4.

풀기

왼쪽 노드의 값은 루트 노드보다 작아야 하고, 오른쪽 노드의 값은 루트 노드보다 커야한다는 내용이다.

여기에 틀린 값이 있는 경우 false를 리턴하고 조건을 모두 만족한다면 true를 리턴하는 내용.

 

나는 DFS로 재귀로 값을 체크해야 한다고 생각했다.

GPT는 좋은 친구라 더 좋은 방법이 있거나 내 코드에 최적화가 필요한게 있는지 확인해주므로 또 확인 요청을 했고

중위순회를 활용할 수도 있다는 내용을 받았다. (!! 빠밤)

 

참고로 나는 중위순회 까먹었다. (아~~ 자격증이나 전공 공부할 때 기억하고 끝나면 까먹는거 국룰 아님~~?~?~)


결과

1. DFS 사용

class Solution {
    fun isValidBST(root: TreeNode?): Boolean {
        return validate(root, Long.MIN_VALUE, Long.MAX_VALUE)
    }

    private fun validate(
        node: TreeNode?,
        min: Long,
        max: Long
    ): Boolean {
        if (node == null) {
            return true
        }

        if (node.`val` <= min || node.`val` >= max) {
            return false
        }

        return validate(node.left, min, node.`val`.toLong()) && validate(node.right, node.`val`.toLong(), max)
    }
}

GPT가 사실 코드 최적화를 도와주었다. (ㅎㅎ)

재귀를 통해 왼쪽의 경우 max에 루트 값을, 오른쪽의 경우 min에 루트 값을 넣어 비교하는 방식이다.

 

 

2. 중위순회(InOrder) 사용

기억이 안나서 인터넷에 검색해봤다.

  • 전위순회(PreOrder) : root - left - right
  • 중위순회(InOrder) : left - root - right
  • 후위순회(PostOrder) : left - right - root

 위 순서대로 탐색한다.

    5
   / \
  3   7
 / \   \
2   4   8

 

GPT가 들어준 예제인데 위 트리를 중위순회 돌면 다음과 같다.

  • 2 - 3 - 4 - 5 - 7 - 8

이게 오름차순이어야 한다는거다!

 

example2

LeetCode가 제시한 예제 2번을 가지고 중위순회를 돌아보면 다음과 같다.

  • 1 - 5 - 3 - 4 - 6

오름차순이 아니다! 따라서 얘는 false가 return 되어야한다.

 

이제 이걸 코드로 구현해보자.

class Solution {
    private var prev = Long.MIN_VALUE

    fun isValidBST(root: TreeNode?): Boolean {
        return inorder(root)
    }

    private fun inorder(
        node: TreeNode?
    ): Boolean {

        if (node == null) {
            return true
        }

        // 왼쪽 서브트리 방문
        if (!inorder(node.left)) {
            return false
        }

        // 현재 노드가 이전 값보다 작거나 같으면 false
        if (node.`val` <= prev) {
            return false
        }
        prev = node.`val`.toLong()

        // 오른쪽 서브트리 방문
        return inorder(node.right)

    }
}

 

'공부 > 코딩테스트 | 알고리즘' 카테고리의 다른 글

[프로그래머스] 전력망을 둘로 나누기 (kotlin)  (0) 2025.03.11
[LeetCode] Maximum Depth of Binary Tree  (0) 2025.02.27
[LeetCode] Min Stack  (0) 2025.02.26
[LeetCode] House Robber  (0) 2025.02.25
[LeetCode] Maximum Subarray  (0) 2025.02.24
'공부/코딩테스트 | 알고리즘' 카테고리의 다른 글
  • [프로그래머스] 전력망을 둘로 나누기 (kotlin)
  • [LeetCode] Maximum Depth of Binary Tree
  • [LeetCode] Min Stack
  • [LeetCode] House Robber
나는 유찌
나는 유찌
쩌리쨩
  • 나는 유찌
    유찌 개발 일기
    나는 유찌
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 사이드 프로젝트
        • 게시판
        • 블로그(Spring boot + React.js ..
      • 데이터베이스
        • SQLD
      • 이슈 해결
      • Front
        • Javascript
        • Vue.js
        • HTML+CSS
      • Backend
        • Spring
        • ORM
        • JAVA
      • 공부
        • HTTP
        • OOP
        • 이것저것
        • 코딩테스트 | 알고리즘
      • Computer Science
        • Computer architecture
        • 데이터베이스
        • 운영체제
      • 일상
        • 독서
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Spring Security AccessDecisionManager
    DIRTY READ
    spring
    히가시노 게이고
    Kotlin AccessDecisionManager
    Access token 재발급
    JWT이란?
    독서
    jwt 로그인 구현
    권한 scope 처리
    Spring boot에서 JWT 구현
    AccessDecisionVoter
    AntPathMatcher
    role scope
    pessimisticlock
    Access Token Refresh Token
    한국소설
    추리소설
    spring 격리수준
    phantom read
    LeetCode
    Kotlin AntPathMatcher
    Spring Boot
    redis 분산락
    access token
    mysql 격리수준
    refresh token
    mssql
    웹 개발
    jwt
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
나는 유찌
[LeetCode] Validate Binary Search Tree
상단으로

티스토리툴바