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 };
  • 相关阅读:
    Spark的Shuffle机制
    Map Reduce的代码学习
    本地IDEA跑阿里云服务器Word Count
    HDFS的类学习和API基本操作
    本地IDEA(Windows)访问ECS服务器HBase
    本地IDEA访问ECS服务器HDFS
    阿里云ECS大数据环境搭建
    学会使用vue ui搭建项目
    用vue封装视频预览组件(手机端)
    项目中的部门使用级联选择器,编辑时初始化选中部门解决方案
  • 原文地址:https://www.cnblogs.com/wmx24/p/9394550.html
Copyright © 2011-2022 走看看