zoukankan      html  css  js  c++  java
  • LeetCode 98. 验证二叉搜索树(Validate Binary Search Tree)

    题目描述

    给定一个二叉树,判断其是否是一个有效的二叉搜索树。

    假设一个二叉搜索树具有如下特征:

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

    示例 1:

    输入:
        2
       / 
      1   3
    输出: true
    

    示例 2:

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

    解题思路

    用树的后序遍历思想,对于每次遍历到的根节点,根据左右子树是否为BST分为四种情况:

    • 若左右子树都不为空,则分别递归判断左右子树是否为BST,并且分别传回左右子树的最小值和最大值。若左右子树都为BST,则比较左子树最大值是否小于根结点值以及右子树最小值是否小于根结点值,满足则为BST并记录本子树的最小值与最大值,否则整棵树不是BST
    • 若左子树为空右子树不为空,则判断右子树是否为BST,并且传回右子树的最小值和最大值。若右子树为BST,则比较右子树最小值是否小于根结点值,满足则为BST并记录本子树的最小值与最大值,否则整棵树不是BST
    • 若右子树为空左子树不为空,则判断左子树是否为BST,并且传回左子树的最小值和最大值。若左子树为BST,则比较左子树最小值是否小于根结点值,满足则为BST并记录本子树的最小值与最大值,否则整棵树不是BST
    • 左右子树都为空,则本子树是BST,并记录根结点值为此子树的最小值与最大值

    代码

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     bool isValidBST(TreeNode* root) {
    13         if(!root) return true;
    14         int minNode, maxNode;
    15         return isBST(root, minNode, maxNode);
    16     }
    17     bool isBST(TreeNode* root, int &minNode, int &maxNode){
    18         int left_max, left_min, right_max, right_min;
    19         bool left = true, right = true;
    20         if(root->left && root->right){
    21             left = isBST(root->left, left_min, left_max);
    22             right = isBST(root->right, right_min, right_max);
    23             if(left && right){
    24                 minNode = min(left_min, root->val);
    25                 maxNode = max(right_max, root->val);
    26                 if(left_max < root->val && right_min > root->val)
    27                     return true;
    28             }
    29         }
    30         if(root->left && !root->right){
    31             left = isBST(root->left, left_min, left_max);
    32             if(left){
    33                 minNode = min(left_min, root->val);
    34                 maxNode = root->val;
    35                 if(left_max < root->val)
    36                     return true;
    37             }
    38         }
    39         if(!root->left && root->right){
    40             right = isBST(root->right, right_min, right_max);
    41             if(right){
    42                 maxNode = max(right_max, root->val);
    43                 minNode = root->val;
    44                 if(right_min > root->val)
    45                     return true;
    46             }
    47         }
    48         if(!root->left && !root->right){
    49             minNode = maxNode = root->val;
    50             return true;
    51         }
    52         return false;
    53     }
    54 };
  • 相关阅读:
    react-router JS 控制路由跳转(转载)
    vue 将值存储到vuex 报错问题
    封装GetQueryString()方法来获取URL的value值(转载)
    vue 里面的watch 选项详解
    谷歌地图api 开发 (转载)
    es6 ...展开运算符
    关于localStorage 应用总结
    js 刷新当前页面会弹出提示框怎样将这个提示框去掉
    深入浅析JavaScript的API设计原则(转载)
    jQuery mouseover与mouseenter,mouseout与mouseleave的区别
  • 原文地址:https://www.cnblogs.com/wmx24/p/9394550.html
Copyright © 2011-2022 走看看