【ALGO】Leetcode 98.驗證二叉搜尋樹

minuxAE發表於2020-11-04

題面

給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。
假設一個二叉搜尋樹具有如下特徵:
節點的左子樹只包含小於當前節點的數。
節點的右子樹只包含大於當前節點的數。
所有左子樹和右子樹自身必須也是二叉搜尋樹。

解析

可以使用中序遍歷的性質或者根據定義進行判斷

AC程式碼

/**
 * 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:
    bool isValidBST(TreeNode* root) {
        if(!root) return true;
        return dfs(root)[0];
    }

    // <子樹狀態, 左子樹最大值, 右子樹最小值>
    vector<int> dfs(TreeNode *root){
        vector<int> ans({1, root->val, root->val});
        if(root->left){
            auto t = dfs(root->left);
            if(!t[0] || t[1]>=root->val) ans[0]=0;
            // 更新極值
            ans[1]=max(ans[1], t[1]);
            ans[2]=min(ans[2], t[2]);
        }

        if(root->right){
            auto t=dfs(root->right);
            if(!t[0] || t[2]<=root->val) ans[0]=0;
            // 更新極值
            ans[1]=max(ans[1], t[1]);
            ans[2]=min(ans[2], t[2]);
        }

        return ans;
    }
};

相關文章