[LeetCode] C ++ : 중간 문제 트리 98. 이진 검색 트리 확인

98. 이진 검색 트리 확인

중급 난이도 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);
    }
};

추천

출처blog.csdn.net/weixin_44566432/article/details/113694578