(트리) 두 갈래 트리가 BST인지 여부 판단

4840 단어
  • 제목: 두 갈래 나무가 BST인지 아닌지 판단..
  • 사고방식: 사실 이 문제는 여러 가지 해결 방법이 있을 수 있다..
  • 방법1: 귀속 해결.BST의 특성에 따라왼쪽은 루트 노드보다 작고 오른쪽은 루트 노드보다 크다.그리고 나무마다 그렇습니다.그래서 우리는 좌우 나무의 값과 뿌리 노드의 값을 직접 귀속적으로 비교할 수 있다.왼쪽 트리의 값은 현재 루트 노드의 값보다 작고 현재 루트 노드의 값을 최대 값으로 왼쪽 트리에 전달하며 왼쪽 트리의 값은 모두 그보다 작고 귀속 처리한다.오른쪽 트리의 값은 모두 루트 노드의 값보다 크고, 루트 노드의 값을 최소값으로 오른쪽 트리에 전하며, 오른쪽 트리의 값은 모두 그보다 크다
  • 코드:
    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        bool isValidBST(TreeNode *root) {
            return isValidBST(root, INT_MIN, INT_MAX);
        }
        bool isValidBST(TreeNode *root, int low, int high){
            if (root == NULL )
                return true;
            if (low < root->val && root->val < high)
                return (isValidBST(root->left, low, root->val) && isValidBST(root->right, root->val, high));
            else
                return false;
        }
    };

     
  • 방법2: BST의 특성 때문에 우리는 반복적인 방법을 이용하여 그를 해결할 수 있다.트리를 중순으로 훑어보고 결과를 vector에 저장합니다. 용기의 값이 점차적으로 정렬된다면 BST입니다. 그렇지 않으면 아닙니다
  • 코드:
    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        bool isValidBST(TreeNode *root) {
            vector<int> res;
            isValidBST(root, res);
            int len = res.size();
            bool flag = true;
            for (int i=0; i1; i++){
                if (res[i] >= res[i+1]){
                    flag = false;
                    break;
                }
            }
            return flag;
        }
        void isValidBST(TreeNode *root, vector<int> &res){
            if (root == NULL)
                return;
            
            isValidBST(root->left, res);
            res.push_back(root->val);
            isValidBST(root->right, res);
        }
    };

     
  • 좋은 웹페이지 즐겨찾기