|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: (Leetcode) 98 - Validate Binary Search Tree |
| 4 | +categories: [스터디-알고리즘] |
| 5 | +tags: |
| 6 | + [ |
| 7 | + 자바, |
| 8 | + java, |
| 9 | + 리트코드, |
| 10 | + Leetcode, |
| 11 | + 알고리즘, |
| 12 | + algorithm, |
| 13 | + dfs, |
| 14 | + tree, |
| 15 | + bst, |
| 16 | + search, |
| 17 | + validate, |
| 18 | + ] |
| 19 | +date: 2024-06-10 01:00:00 +0900 |
| 20 | +toc: true |
| 21 | +--- |
| 22 | + |
| 23 | +기회가 되어 [달레님의 스터디](https://github.com/DaleStudy/leetcode-study)에 참여하여 시간이 될 때마다 한문제씩 풀어보고 있다. |
| 24 | + |
| 25 | +[https://neetcode.io/practice](https://neetcode.io/practice) |
| 26 | + |
| 27 | +--- |
| 28 | + |
| 29 | +[https://leetcode.com/problems/validate-binary-search-tree/](https://leetcode.com/problems/validate-binary-search-tree/) |
| 30 | + |
| 31 | +## 내가 작성한 풀이 |
| 32 | + |
| 33 | +어떻게 해결할지 많은 고민을 하였다. |
| 34 | + |
| 35 | +처음에는 그냥 단순히 부모와 자식간의 값의 비교하는 형태로 진행했었는데 |
| 36 | +그렇게 하면 테스트를 통과하지 못한다. |
| 37 | +부모의 부모, 부모의 부모의 부모 ... 까지 고려해야한다. |
| 38 | + |
| 39 | +그래서 해당 노드의 위치가 정상적인 위치인지 어떻게 고려할 수 있을지 규칙을 찾아보니 left로 갈 때 max를 자신으로, right로 갈 때는 min을 자신으로 삼아가면서 dfs를 진행하면 해결할 수 있다는 것을 알게되었다. |
| 40 | + |
| 41 | +```java |
| 42 | +class Solution { |
| 43 | + public boolean isValidBST(TreeNode root) { |
| 44 | + return dfs(root.left, (long) Integer.MIN_VALUE - 1, root.val) |
| 45 | + && dfs(root.right, root.val, (long) Integer.MAX_VALUE + 1); |
| 46 | + } |
| 47 | + |
| 48 | + private boolean dfs(TreeNode node, long min, long max) { |
| 49 | + if (node == null) { |
| 50 | + return true; |
| 51 | + } |
| 52 | + |
| 53 | + // left로 갈 때 max를 자신으로, right로 갈 때는 min을 자신으로 |
| 54 | + if (!(dfs(node.left, min, node.val) |
| 55 | + && dfs(node.right, node.val, max))) { |
| 56 | + return false; |
| 57 | + } |
| 58 | + |
| 59 | + return node.val > min && node.val < max; |
| 60 | + } |
| 61 | +} |
| 62 | +``` |
| 63 | + |
| 64 | +특이한 점은 long을 사용했다는 점인데 문제에서 제시한 노드의 값 범위는 다음과 같다. |
| 65 | + |
| 66 | +``` |
| 67 | +-2^31 <= Node.val <= 2^31 - 1 |
| 68 | +``` |
| 69 | + |
| 70 | +이 것은 정확하게 int의 범위와 일치하기 때문에 노드의 값이 Integer.MIN_VALUE, Integer.MAX_VALUE 일 경우 문제가 발생할 수 있는 여지가 있다. |
| 71 | +그래서 어쩔 수 없이 long으로 받도록 처리하였다. |
| 72 | + |
| 73 | +### TC, SC |
| 74 | + |
| 75 | +시간 복잡도는 O(n)이고, 공간 복잡도는 O(n)이다. 트리가 균등한 형태라면 공간복잡도가 O(logn) 에 가까워진다. |
0 commit comments