Skip to content

Commit e1ef62a

Browse files
committed
rivkode validate bst
1 parent 0947160 commit e1ef62a

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
7+
* TreeNode() {}
8+
* TreeNode(int val) { this.val = val; }
9+
* TreeNode(int val, TreeNode left, TreeNode right) {
10+
* this.val = val;
11+
* this.left = left;
12+
* this.right = right;
13+
* }
14+
* }
15+
*/
16+
17+
/*
18+
1. 문제 이해
19+
20+
트리가 주어졌을 때 해당 트리가 BST인지 판별
21+
BST인제 판별하는 방법은 key 기준 left는 작아야 하고 right는 커야 한다.
22+
이 조건이 실패하면 해당 트리는 BST가 아니다.
23+
24+
2. 예외 케이스
25+
26+
노드 개수의 범위는
27+
tree node가 1개부터 최고 1만개 까지
28+
29+
1개일 경우
30+
바로 반환
31+
32+
그 외는 계산 진행
33+
34+
35+
3. 알고리즘 선택
36+
37+
dfs 선택
38+
a. 노드 key 기준으로 계속 파고들어서 반복할 수 있을 것 같아서
39+
b. left, right가 있는지를 기준으로 있다면 다시 dfs가 가능해서
40+
41+
bfs로 해도 key를 알고 있으니까 되긴 할 것 같은데 일단 dfs로 해보자
42+
43+
아니다 bfs로 해야할 것 같은데 ? 이게 깊게 들어가는게 중요한게 아니라 전체 탐색을 해야하니 순차적으로 key들을 탐색하면서 작은지 큰지를 판별하면 될 것 같다.
44+
45+
bfs로 진행해보자
46+
47+
아니다 .. dfs가 맞네 하한 상한을 정해줘야 함
48+
그리고 예외 케이스 있다 [-2147483648,null,2147483647]
49+
50+
처음에 하한과 상한을 MIN_VALUE, MAX_VALUE를 통해 사용하고 있었는데 위 엣지 케이스를 발견
51+
52+
처음에는 Integer.MIN_VALUE 와 같이 Integer을 사용해서 위 예외 케이스를 만났는데
53+
이걸 15분 동안 고민하다 gemini 한테 물어보니까 그냥 Long 쓰면 된단다 ...
54+
Long으로 변경하니 통과 ..
55+
56+
만약 조건범위가 Long 의 범위였다면 ,,? 어떻게 해결해야했을까.
57+
4. 구현
58+
59+
*/
60+
61+
import java.util.*;
62+
63+
class Solution {
64+
public boolean isValidBST(TreeNode root) {
65+
Long min = Long.MIN_VALUE;
66+
Long max = Long.MAX_VALUE;
67+
68+
if (root.left == null && root.right == null) {
69+
return true;
70+
}
71+
72+
return dfs(root, min, max);
73+
74+
}
75+
76+
public boolean dfs(TreeNode node, long min, long max) {
77+
if (node == null) {
78+
return true;
79+
}
80+
81+
// 정상 범위
82+
if (min < node.val && node.val < max) {
83+
return dfs(node.left, min, node.val) && dfs(node.right, node.val, max);
84+
} else {
85+
return false;
86+
}
87+
}
88+
89+
// 아래와 같이 풀려고 했으나 하한값과 상한값에 대한 인자를 넘겨줘야 하는데 넘겨줄 수 없어서 dfs로 풀어야 함
90+
// 에러 케이스
91+
// [5,4,6,null,null,3,7]
92+
// private static int preKey;
93+
// public boolean isValidBST(TreeNode root) {
94+
// Queue<TreeNode> queue = new LinkedList<>();
95+
96+
// queue.offer(root);
97+
// preKey = root.val;
98+
99+
// while (!queue.isEmpty()) {
100+
// TreeNode node = queue.poll();
101+
// int key = node.val;
102+
// TreeNode left = node.left;
103+
// TreeNode right = node.right;
104+
105+
// // left 처리
106+
// if (left != null) {
107+
// queue.offer(left);
108+
// if (left.val >= key) {
109+
// return false;
110+
// }
111+
112+
// if ()
113+
// }
114+
115+
// // right 처리
116+
// if (right != null) {
117+
// queue.offer(right);
118+
// if (right.val <= key) {
119+
// return false;
120+
// }
121+
// }
122+
// }
123+
124+
// return true;
125+
// }
126+
}
127+

0 commit comments

Comments
 (0)