首页 > 其他分享 >98. 验证二叉搜索树

98. 验证二叉搜索树

时间:2024-11-15 17:19:11浏览次数:1  
标签:head right TreeNode val 验证 二叉 98 二叉树 left

  1. 题目链接

  2. 解题思路

    • 这种二叉树的题目,绝大部分可以用「二叉树的递归套路」来解决,那么什么是「二叉树的递归套路」?其实就是每个节点会有信息,该节点信息怎么来的?左儿子的信息 + 右儿子的信息 ,然后加工成自己的信息。
    • 根结点是否是搜索二叉树?需要左儿子和右儿子给什么信息?
      • 首先要知道左子树和右子树,是否是搜索二叉树
      • 然后要知道左子树的最大值left_max,以及右子树的最小值right_min,然后根结点val > left_max,同时val < right_min
    • 那么,「每个节点的信息」究竟是什么?
      • 注意,对于根节点来说,其左儿子A,是左子树,但是对于A自己来说,A自己就是「根」
      • 也就是说,每个节点,我们要看成是「独立」的,不能认为某个节点是「左子树」,或者是「右子树」,因为我们要递归,当来到某一个递归时,我们根本不知道该节点到底是什么情况。
      • 所以,「每个节点的信息」要保持一致
      • 拿本题来说,我只需要知道左子树的最大值,右子树的最小值,但是,「每个节点的信息」要保持一致,所以我们需要的信息就是:1️⃣以该节点为根,整体是否是搜索二叉树;2️⃣以该节点为根,最大值是什么;3️⃣以该节点为根,最小值是什么
    • 我们得到「根的信息」后,直接返回1️⃣即可
  3. 代码

    /**
     * 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:
    
        struct Info{
            bool isSearch;   // 是否是搜索二叉树
            int _min;        // 最小值
            int _max;        // 最大值
        };
    
        bool finish = false;    // 如果发现有一个小子树不是搜索二叉树了  可以提前结束了
    
        // 保证调用这个函数时,head不等于nullptr
        Info process(TreeNode *head) {
            if (finish) {   // 提前结束了
                return {false, 0, 0};    // 无用值
            }
            bool isSearch = true;
            int _min = head->val;
            int _max = head->val;
            if (head->left != nullptr) {    // 左子树不为空  问左子树要答案
                Info left_info = process(head->left);
                // 这里是一个小加速,如果左子树都不是搜索二叉树了 
                // 以head为头的,肯定也不是搜索二叉树了,其他的信息也没不重要了
                if (left_info.isSearch == false) {
                    finish = true;
                    return Info{false, _min, _max};
                }
                // 小加速  和上述理由一样
                if (head->val <= left_info._max) {
                    finish = true;
                    return Info{false, _min, _max};
                }
                _min = left_info._min;    // 更新以head为头的最小值
            }
    
            if (head->right != nullptr) {
                Info right_info = process(head->right);
                if (right_info.isSearch == false) {
                    finish = true;
                    return Info{false, _min, _max};
                }
                if (head->val >= right_info._min) {
                    finish = true;
                    return Info{false, _min, _max};
                }
                _max = right_info._max;
            }
            return Info(isSearch, _min, _max);
        }
    
        bool isValidBST(TreeNode* root) {
            if (root == nullptr) {
                return true;
            }
            Info ans = process(root);
            return ans.isSearch;
        }
    };
    

标签:head,right,TreeNode,val,验证,二叉,98,二叉树,left
From: https://www.cnblogs.com/ouyangxx/p/18548343

相关文章

  • 102. 二叉树的层序遍历
    题目链接解题思路层序遍历就是用队列,本题需要一层一层收集答案,所以我们可以用一个变量cur,表示该层还剩多少节点需要收集,同时,遇到一个节点,还要将其孩子节点放入队尾。那么我们怎么知道下一层的节点个数,所以还需要一个变量next,记录下一层的节点个数。总结一遍:每次从队头......
  • LeetCode654.最大二叉树
    LeetCode刷题记录文章目录......
  • 如何使用正则表达式验证域名
    下面是一篇关于如何使用正则表达式验证域名的教程。如何使用正则表达式验证域名简介域名是互联网上网站的地址,每个域名由多个标签(label)组成,标签之间用点.分隔。域名规则有很多细节,但基本要求是:每个标签只能包含字母、数字和短横线-。标签的长度不能超过63个字符。......
  • Codeforces Round 986 (Div. 2)
    AB没什么好说的。C把我卡了。dp非常明显,最开始我想的是单向做,\(f[i][0/1]\)表示前\(i\)块蛋糕已经分出去了,01表示Alice是否拿过了,此时分给了几个人。尝试写写转移就知道为什么寄了。状态不够,没法表示答案。就算转移到了最后也没法得出我们需要的答案。可以发现,这个dp不好做的......
  • 【魔珐有言-注册/登录安全分析报告-无验证方式导致安全隐患】
    前言由于网站注册入口容易被黑客攻击,存在如下安全问题:1.暴力破解密码,造成用户信息泄露2.短信盗刷的安全问题,影响业务及导致用户投诉3.带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞所以大部分网站及App都采取图形验证码或滑动验证码等交互解决方案,但在机......
  • 【AiPPT-注册/登录安全分析报告-无验证方式导致安全隐患】
    前言由于网站注册入口容易被黑客攻击,存在如下安全问题:1.暴力破解密码,造成用户信息泄露2.短信盗刷的安全问题,影响业务及导致用户投诉3.带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞所以大部分网站及App都采取图形验证码或滑动验证码等交互解决方案,但在机......
  • 【题解】CF1982
    A考虑两队的领先情况改变,那么一定有某一时刻两队的比分相等于是首先检查最开始的领先队伍,再检查现在的领先队伍,如果前后不同,则\(YES\),否则\(NO\)B注意到当\(x=1\),则会进入循环,手模一下发现\(ans=k\%(y-1)+1)\)现在的问题是:什么时候\(x=1\)?直接手动模拟即可,不难证明时......
  • 数据结构 ——— 利用前序序列重建链式二叉树
    目录题目要求链式二叉树示意图​编辑代码实现 题目要求读入用户输入的一串前序遍历的字符串,根据此字符串建立一个链式二叉树例如前序遍历的字符串为:ABC##DE#G##F###;其中"#"表示空树链式二叉树示意图以此图的链式二叉树为例子那么此链式二叉树前序遍历转换为字符......
  • 【Azure App Service】在App Service for Windows上验证能占用的内存最大值Y5
    问题描述在创建AppService服务的时候,根据定价层不同,内存使用的最大值也有不同。但在实际测试中,发现内存最大只能占用2GB左右,而定价层中内存分配明明是大于2GB(比如B3定价层的内存为7GB),这是一种什么情况呢?在AppService中Kudu工具上,查看进程分配的内存大小:问题解答使用......
  • 数据库字段设置非空, phalcon创建数据验证不通过
    在使用phalcon的insert和update功能时,因为数据库所有的字段设置的都是NOTNULL,而phalcon的model在插入或更新之前会自动判断字段是否需要必填,因此导致有空字段时无法存入。开始遇到这问题时,想到两种解决方法:一、改数据库字段,把NOTNULL改为可以为空。但该数据库还得去找DBA......