栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

leetcode 98.验证二叉搜索树

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode 98.验证二叉搜索树

98.验证二叉搜索树 题目描述

解题思路

二叉搜索树的特点就是左子树的值都小于根结点,右子树的值都大于根结点。那么我们就可以进行判断操作了。
方法一:递归方法,从头结点开始,均需要每个结点的值在一个范围内。这个范围的确定会随着向下的遍历,慢慢缩小。
方法二:迭代的方法
采用中序遍历的方法,如果出现上一个访问的结点比当前的结点的值小,那么此二叉树不是二叉搜索树。

代码实现
class Solution {
public:
//方法一
    // //判断是否是二叉搜索树
    // //递归实现方法
    bool isValidBST(TreeNode* root) 
    {
        return check(root,LONG_MIN,LONG_MAX); 
    }

    //传入参数值说明
    bool check(TreeNode* root,int leftval,int rightval)
    {   //如果根节点为空格,返回true
        if(root == nullptr)
        {
            return true;
        }
        //如果根节点的值不在最大最小值中间,返回错误
        if(root->val >= rightval || root->val <= leftval)
        {
            return false;
        }
        //如果根节点的值在最大最小值之间

        return check(root->left,leftval,root->val) && check(root->right,root->val,rightval);
    }

    //方法二
    //非递归实现中序遍历
    bool isValidBST(TreeNode* root) 
    {
        int val = LONG_MIN;
        if(root == nullptr)
        {
            return true;
        }
        //创建一个栈来保存访问的结点
        stack  stk;
        TreeNode * node = root;
        //当栈不为空或者结点指针不为空
        while(stk.empty() == false  || node != nullptr)
        {
            while(node)
            {
                stk.push(node);     //node结点地址压入栈中
                node = node->left;
            }
            node = stk.top();       //node获取上个结点
            stk.pop();              //弹出栈顶结点
            if(node->val <= val)
            {
                return false;
            }
            
            val = node->val;
            node = node->right;     //访问右结点
        }
        return true;

    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1012078.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号