zoukankan      html  css  js  c++  java
  • 算法24 leetcode98 验证二叉搜索树

    没做出来,复盘一下

    题目

    给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

    有效 二叉搜索树定义如下:

    节点的左子树只包含 小于 当前节点的数。
    节点的右子树只包含 大于 当前节点的数。
    所有左子树和右子树自身必须也是二叉搜索树。

    示例 1:

    输入:root = [2,1,3]
    输出:true
    示例 2:

    输入:root = [5,1,4,null,null,3,6]
    输出:false
    解释:根节点的值是 5 ,但是右子节点的值是 4 。

    提示:

    树中节点数目范围在[1, 104] 内
    -231 <= Node.val <= 231 - 1

    作者:力扣 (LeetCode)
    链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn08xg/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    代码

    11.29

    输入[5,1,4,null,null,3,6]为什么会报错
    Line 25: Char 18: runtime error: member access within null pointer of type 'TreeNode' (solution.cpp)
    SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:34:18
    而且只运行了一次stdout 0

    11.30

    好吧,输出位置错了
    该判断第一个指针是不是空

            if(root==nullptr) return 2147483647;
    

    这逻辑又错了,搞复杂了

    /**
     * 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:
        int i=0;
        bool isValidBST(TreeNode* root) {
            cout<<i++<<endl;
            if(root==nullptr) return 1;
            int lMax=leRi(root);
            int rMin=riLe(root);
            if(root->left!=nullptr&&(root->left->val>=root->val||lMax>=root->val)) return 0;
            if(root->right!=nullptr&&(root->right->val<=root->val||rMin<=root->val)) return 0;
            return isValidBST(root->left)&&isValidBST(root->right);
        }
        int leRi(TreeNode *root){
            if(root->left==nullptr) return 0;
            if(root->left==nullptr||root->left->right==nullptr) return 0;
            return max(leRi(root->left->right),root->left->right->val);
        }
        int riLe(TreeNode *root){
            if(root->right==nullptr||root->right->left==nullptr) return 9999999;
            return min(leRi(root->left->right),root->left->right->val);
        }
    };
    

    11.30fail

    [120,70,140,50,100,130,160,20,55,75,110,119,135,150,200]
    右边的左边的左边检查不到!!!

    /**
     * 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:
        int i=0;
        bool isValidBST(TreeNode* root) {
            // cout<<i++<<endl;
            if(root==nullptr) return 1;
            int lMax=leRi(root);
            int rMin=riLe(root);
            if(root->left!=nullptr&&(root->left->val>=root->val||lMax>=root->val)){
                cout<<"lft";
                return 0;
            }
            if(root->right!=nullptr&&(root->right->val<=root->val||rMin<=root->val)){
                cout<<"rt";
                return 0;
            }
            return isValidBST(root->left)&&isValidBST(root->right);
        }
        int leRi(TreeNode *root){
            return (root->left==nullptr||root->left->right==nullptr) ? INT_MIN:root->left->right->val;
    
            // if(root->left==nullptr) return 0;
            // if(root->left==nullptr||root->left->right==nullptr) return 0;
            // return max(leRi(root->left->right),root->left->right->val);
        }
        int riLe(TreeNode *root){
            if(root->right==nullptr||root->right->left==nullptr){
            cout<<"no";
            return INT_MAX;
            }else return root->right->left->val;
        }
    };
    

    11.30 23:12

    class Solution {
    public:
        int i=0;
        bool isValidBST(TreeNode* root) {
           
            return isValidBST(root,LONG_MIN,LONG_MAX);
        }
        bool isValidBST(TreeNode *boot,long min,long max){
            if(boot==nullptr) return 1;
            if(boot->val>=max||boot->val<=min) return  0;
            return isValidBST(boot->left,min,boot->val)&&isValidBST(boot->right,boot->val,max);//精髓!!之前这里max和min参数写成LONG_MIN、LONG_MAX无语
        }  
    };
    
  • 相关阅读:
    WCF 第十三章 可编程站点 为站点创建操作
    WCF 第十三章 可编程站点 所有都与URI相关
    WCF 第十二章 对等网 使用自定义绑定实现消息定向
    WCF 第十三章 可编程站点 使用WebOperationContext
    Using App.Config for user defined runtime parameters
    WCF 第十三章 可编程站点
    WCF 第十三章 可编程站点 使用AJAX和JSON进行网页编程
    WCF 第十二章 总结
    WCF 第十三章 可编程站点 使用WebGet和WebInvoke
    WCF 第十三章 可编程站点 URI和UriTemplates
  • 原文地址:https://www.cnblogs.com/impw/p/15626959.html
Copyright © 2011-2022 走看看