728x90
반응형
문제 :
예시 :
제한 조건 :
시도1 : 처음에는 부모랑만 비교하면 된다고 생각했다.
그래서 간단히 정리해본 수도코드와 실제 코드
class Solution {
public static final int LEFT = 0;
public static final int RIGHT = 1;
public boolean isValidBST(TreeNode root) {
return checkValid(root.left, root.val, LEFT)
&& checkValid(root.right, root.val, RIGHT);
}
private boolean checkValid(TreeNode node, int parentValue, int side) {
if(node == null) return true;
// should node.value is smaller thgan parentValue.
if(side == LEFT && node.val >= parentValue) return false;
if(side == RIGHT && node.val <= parentValue) return false;
return checkValid(node.left, node.val, LEFT)
&& checkValid(node.right, node.val, RIGHT);
}
}
근데 !!
틀려버림
보니까 바로 부모만 생각하면 안되고 부모 전체를 생각해야 했었다!!
그래서 시도2
class Solution {
public static final int LEFT = 0;
public static final int RIGHT = 1;
public boolean isValidBST(TreeNode root) {
ArrayList<Integer> parents = new ArrayList<>();
parents.add(root.val);
return checkValid(root.left, parents, LEFT)
&& checkValid(root.right, parents, RIGHT);
}
private boolean checkValid(TreeNode node, ArrayList parents, int side) {
if(node == null) return true;
// should node.value is smaller thgan parents.
if(side == LEFT) {
for(int i=0; i<parents.size(); i++) {
if(node.val >= (int)parents.get(i)) return false;
}
parents.add(node.val);
}
// should node.value is greater thgan parents.
if(side == RIGHT) {
for(int i=0; i<parents.size(); i++) {
if(node.val <= (int)parents.get(i)) return false;
}
parents.add(node.val);
}
return checkValid(node.left, parents, LEFT)
&& checkValid(node.right, parents, RIGHT);
}
}
이거는 left 부모도 모두 저장되서 실패..
계속 생각해도 모르겠어서 유튜브에 푸는 방법을 검색해보았다.
https://youtu.be/s6ATEkipzow?si=mhnMkeRL7b4cuJE4
코드까지 보진 않고 푸는 방법에 대한 힌트만 얻고 혼자 해봄
그냥 간단하게 최소/최대 값을 정하면 되는거였어!!!!
유레카ㅏ아ㅏㅏ!!!
그래서 바로 다시 시도
시도3 :
class Solution {
public boolean isValidBST(TreeNode root) {
return checkValid(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
private boolean checkValid(TreeNode node, int min, int max) {
if(node == null) return true;
if(node.val <= min || node.val >= max) {
return false;
}
return checkValid(node.left, min, node.val)
&& checkValid(node.right, node.val, max);
}
}
이전에 틀렸던 예제는 넘어갔는데, 문제는 !!!
숫자 범위를 항상 생각해야 되는데, 이 부분도 항상 조심해야하는 부분!!
쩄든 그래서 Integer -> long으로 변경
시도 4:
class Solution {
public boolean isValidBST(TreeNode root) {
return checkValid(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
private boolean checkValid(TreeNode node, long min, long max) {
if(node == null) return true;
if(node.val <= min || node.val >= max) {
return false;
}
return checkValid(node.left, min, node.val)
&& checkValid(node.right, node.val, max);
}
}
통과아아아!!!!!
야호 패스했다!!
Complexity
Time Complexity : O(n)
Space Complexity : O(n) / However, in a balanced binary tree, the space complexity would be closer to O(log n).
https://leetcode.com/problems/validate-binary-search-tree/solutions/4995736/java-solution
728x90
반응형
'ALGORITHM > Java algorithm' 카테고리의 다른 글
[JAVA][LeetCode][SlidingWindow] #121. Best Time to Buy and Sell Stock (0) | 2024.04.14 |
---|---|
[Java][Leetcode][BST] 501. Find Mode in Binary Search Tree (0) | 2024.04.10 |
[JAVA][LeetCode] #1. Two Sum (1) | 2022.11.21 |
[LeetCode][Java] 111. Minimum Depth of Binary Tree (0) | 2022.09.05 |
[LeetCode][Java] 110. Balanced Binary Tree (0) | 2022.09.05 |