중급 난이도 914
이진 트리가 주어지면 유효한 이진 검색 트리인지 판단하십시오.
이진 검색 트리에 다음과 같은 특성이 있다고 가정합니다.
- 노드의 왼쪽 하위 트리에는 현재 노드 보다 작은 숫자 만 포함 됩니다.
- 노드의 오른쪽 하위 트리에는 현재 노드 보다 큰 숫자 만 포함 됩니다.
- 모든 왼쪽 하위 트리와 오른쪽 하위 트리 자체도 이진 검색 트리 여야합니다.
예 1 :
입력 : 2 / \ 1 3 출력 : 참예 2 :
입력 : 5 / \ 1 4 / \ 3 6 출력 : false 설명 : 입력은 [5,1,4, null, null, 3,6]입니다. 루트 노드의 값은 5이지만 오른쪽 자식 노드의 값은 4입니다.
1. 순회 순회
이진 검색 트리를 순서대로 순회 한 후 얻은 시퀀스는 오름차순이어야합니다.
따라서 매번 현재 노드 값이 이전 순회 순회에서 얻은 노드 값보다 큰지 비교할 때, 그 이상이면 이진 검색 트리가 아님을 의미합니다
inorder의 초기 값은 매우 작은 수로 설정되어야하며 각 노드가 순회 된 후에는 inorder로 업데이트되어야하므로 비교할 때마다 이전 노드 값이 현재 노드와 비교됩니다. 값이며 순서가 있어야합니다. 순회 할 수 있습니다.
참고 : 주제는 노드 값의 크기를 지정하지 않으므로 최대한 크게 설정하는 것이 가장 좋습니다. 다음 두 가지 쓰기 방법이 모두 가능합니다.
// long long inorder = (long long) INT_MIN-1;
긴 긴 순서 = LONG_MIN;
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isValidBST(TreeNode* root) {
stack<TreeNode*> stk;
long long inorder = (long long) INT_MIN - 1;
while(root != nullptr || !stk.empty()){
while(root != nullptr){
stk.push(root);
root = root->left;
}
root = stk.top();
stk.pop();
if(root->val <= inorder){
return false;
}
inorder = root->val;
root = root->right;
}
return true;
}
};
2. 재귀
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool helper(TreeNode* root, long long low, long long high){
if(root == nullptr){
return true;
}
if(root->val <= low || root->val >= high){
return false;
}
return helper(root->left, low, root->val) && helper(root->right, root->val, high);
}
bool isValidBST(TreeNode* root) {
return helper(root, LONG_MIN, LONG_MAX);
}
};