1. 程式人生 > 實用技巧 >LeetCode98 驗證二叉搜尋樹

LeetCode98 驗證二叉搜尋樹

最討厭寫資料結構了。但是不得不寫
這題意思就是確定一個二叉排序樹合不合法,我儲存了左子樹和柚子樹的最大最小值然後判斷一下
五連wa哭了

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    long long min(long long a, long long b)
    {
        if(a<b) return a;
        return b;
    }
    long long max(long long a, long long b)
    {
        if(a>b) return a;
        return b;
    }
    bool judgeTree(TreeNode *root, long long *minVal, long long *maxVal)
    {
        //*minVal = 100000, *maxVal = -100000;
        long long leftMin = 10000000000, leftMax = -10000000000;
        long long rightMin = 10000000000, rightMax = -10000000000;
        if(!root) return true;
        if(!judgeTree(root->left, &leftMin, &leftMax)) return false;
        
        printf("curnum = %d\n curLEFTmin = %d\n curLEFTmax = %d\n", root->val,leftMin,leftMax);
        if(!judgeTree(root->right, &rightMin, &rightMax)) return false;
        printf("curnum = %d\n curRmin = %d\n curRmax = %d\n", root->val,rightMin,rightMax);
        if(root->left) 
        {
            *minVal = min(*minVal, leftMin);
            *maxVal = max(*maxVal, leftMax);
            if(leftMax>=root->val) return false;
        }
        if(root->right) 
        {
            *minVal = min(*minVal, rightMin);
            *maxVal = max(*maxVal, rightMax);
            if(rightMin<=root->val) return false;
        }
        *minVal = min(*minVal, root->val);
        *maxVal = max(*maxVal, root->val);
        printf("curnum = %d\n curmin = %d\n curmax = %d\n", root->val,*minVal,*maxVal);
        return true;        
    }

    bool isValidBST(TreeNode* root) {
        long long minVal = 10000000000, maxVal = -10000000000;
        return judgeTree(root, &minVal, &maxVal);
    }
};