• 【树】判断一棵树是不是BST


    题目描述:https://leetcode-cn.com/problems/validate-binary-search-tree/

    思路一:递归

    • 根据每一个结点键值的边界进行判断,如果不超出边界则合法,然后分别递归判断左右子树的结点
    • 宏LONG_MAX和LLONG_MAX均存在与头文件limits.h中,分别表示long int 和long long int类型的最大值。
    • 注意,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         return isValidBSTfun(root,LLONG_MIN,LLONG_MAX);     
    14     }
    15 
    16     bool isValidBSTfun(TreeNode* root,long long min,long long max){
    17         if(root==nullptr)
    18             return true;
    19         if(root->val<=min||root->val>=max)
    20             return false;
    21         return (isValidBSTfun(root->left,min,root->val)&&isValidBSTfun(root->right,root->val,max));
    22     }
    23 };

    思路二:中序遍历

    • 因为对BST进行中序遍历就能得到键值递增的序列,所以只要中序遍历的时候后一个结点的键值比前一个结点的键值大就是BST
    • 不断的将当前结点node的键值与node前一个结点的键值pre比较,如果符合就更新pre=node->val.
    • 注意,pre要传地址过去,因为在函数体内要对pre的值修改,传值的话无法达到目的
     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         long long pre=LLONG_MIN;
    14         return isValidBSTfun(root,pre);     
    15     }
    16 //node是当前结点,pre是左儿子的边界
    17     bool isValidBSTfun(TreeNode* node,long long &pre){
    18         if(node==nullptr)
    19             return true;
    20         if(isValidBSTfun(node->left,pre)){
    21             if(node->val>pre){
    22                 pre=node->val;
    23                 return isValidBSTfun(node->right,pre);
    24             }
    25             else
    26                 return false;
    27         }
    28         else
    29             return false;
    30     }
    31 };
  • 相关阅读:
    地图相关
    爬虫机器人检测网站
    Git 工作区、暂存区和版本库概念
    linux镜像下载地址
    selenium基本使用
    socket 编程
    视频观看时间统计
    油猴脚本
    (II)第十三节:使用注解创建Dao、Service、Controller Bean 组件
    (II)第十一节:SpEL 表达式
  • 原文地址:https://www.cnblogs.com/PennyXia/p/12758597.html
Copyright © 2020-2023  润新知