(Tree) Validate Binary Search Tree
12 Nov 2019 | algorithm programming leetcode주어진 트리가 이진 탐색 트리가 맞는지 검증하는 문제이다.
이진 검색 트리란, 한 노드의 왼쪽 서브트리가 모두 부모보다 작은 노드로 이루어져 있고, 한 노드의 오른쪽 서브트리는 모두 부모보다 큰 노드로 이루어져 있는 트리를 말한다.
처음엔 무조건 왼쪽자식, 오른쪽 자식만 검사했었는데 이렇게 하면 조상으로부터 lowerBound, upperBound의 제약을 받기 때문에 이 문제를 풀 수 없다.
따라서 lowerBound와 upperBound를 바꾸어 나가며 탐색해야 한다.
이 문제를 풀 때 처음엔 바운드의 초기값을 Integer.MAX Integer.MIN 으로 하였더니 테스트케이스에 이 값이 들어있을 경우에 패스할 수 없었다.
따라서 Long.MAX Long.MIN으로 대체하였다.
class Solution {
private boolean isValidBST(TreeNode node, long upperBound, long lowerBound) {
if (node == null) {
return true;
}
if (upperBound <= node.val) {
return false;
} else if (lowerBound >= node.val) {
return false;
}
return isValidBST(node.left, node.val, lowerBound) && isValidBST(node.right, upperBound, node.val);
}
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
if (root.left == null && root.right == null) {
return true;
}
return isValidBST(root, Long.MAX_VALUE, Long.MIN_VALUE);
}
}
MIN, MAX 값 없이 푼 사람의 풀이
class Solution {
public boolean isValidBST(TreeNode root) {
ArrayList<TreeNode> list = new ArrayList<>();
ArrayList<TreeNode> check = new ArrayList<>();
boolean valid = true;
check = inorder(root, list);
for(int i = 0; i < check.size() - 1; i++)
{
if(check.get(i + 1).val <= check.get(i).val)
valid = false;
}
return valid;
}
public ArrayList<TreeNode> inorder(TreeNode root, ArrayList<TreeNode> list)
{
if(root == null)
return new ArrayList<TreeNode>();
inorder(root.left, list);
list.add(root);
inorder(root.right, list);
return list;
}
}