|
| 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