• LeetCode98. 验证二叉搜索树


     验证二叉搜索树
     *
     * https://leetcode-cn.com/problems/validate-binary-search-tree/description/
     *
     * algorithms
     * Medium (27.95%)
     * Likes:    340
     * Dislikes: 0
     * Total Accepted:    53K
     * Total Submissions: 189.7K
     * Testcase Example:  '[2,1,3]'
     *
     * 给定一个二叉树,判断其是否是一个有效的二叉搜索树。
     * 
     * 假设一个二叉搜索树具有如下特征:
     * 
     * 
     * 节点的左子树只包含小于当前节点的数。
     * 节点的右子树只包含大于当前节点的数。
     * 所有左子树和右子树自身必须也是二叉搜索树。
     * 
     * 
     * 示例 1:
     * 
     * 输入:
     * ⁠   2
     * ⁠  / 
     * ⁠ 1   3
     * 输出: true
     * 
     * 
     * 示例 2:
     * 
     * 输入:
     * ⁠   5
     * ⁠  / 
     * ⁠ 1   4
     * / 
     * 3   6
     * 输出: false
     * 解释: 输入为: [5,1,4,null,null,3,6]。
     * 根节点的值为 5 ,但是其右子节点值为 4 。
     * 
     * 
     */
    根据二叉搜索树的定义 其中序遍历是递增的
    //中序遍历
    class Solution {
    public:
        TreeNode* pre;
        bool isValidBST(TreeNode* root) {
            if(!root) return true;
            stack<TreeNode*>ss;
            TreeNode* cur=root;
            while(ss.size()||cur)
            {
                while (cur)
                {
                    ss.push(cur);
                    cur=cur->left;
                }
                cur=ss.top();
                ss.pop();
                if(pre&&pre->val >= cur->val) return false;
                pre=cur;
                cur=cur->right;
            }
            return true;
            
        }
    };
    //递归我是真的想不开啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
    //啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
    //啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
    //啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
    class Solution{
    private:
         bool anotherBST(TreeNode* root,int* lower,int* upper)
         {
              if(root==NULL) return true;
              if(lower!=NULL&&root->val<=(*lower)) return false;
              if(upper!=NULL&&root->val>=(*upper)) return false;
              if(!anotherBST(root->left,lower,&(root->val))) return false;
              if(!anotherBST(root->right,&(root->val),upper)) return false;
              return true;
         }
    
    public:
         bool isValidBST(TreeNode* root)
              {
                   return anotherBST(root,NULL,NULL);
              }
    };

    直觉
    乍一看,这是一个平凡的问题。只需要遍历整棵树,检查 node.right.val > node.val 和
    node.left.val < node.val 对每个结点是否成立。

     

    问题是,这种方法并不总是正确。不仅右子结点要大于该节点,整个右子树的元素都应该大于该节点。例如:

    这意味着我们需要在遍历树的同时保留结点的上界与下界,在比较时不仅比较子结点的值,也要与上下界比较。

     代码就是上面的递归方式,,在子树是否为二叉树的判定中,*low和*up是不同的值。如上图 遍历到4时,其lower是5,upper是6

  • 相关阅读:
    ASP.NET 配置log4net启用写错误日志功能
    jQuery formValidator表单验证插件
    jQuery Easy Validate Plugin
    https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
    Request 分别获取具有相同 name 属性表单元素值
    asp.net开源CMS推荐
    客户对账单本月欠款
    AR 客户本月回款
    应收帐款汇总
    采购订单关闭之PL/SQL实现方法
  • 原文地址:https://www.cnblogs.com/renzmin/p/11996198.html
Copyright © 2020-2023  润新知