(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; } }