IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode98验证二叉搜索树刷题打卡 -> 正文阅读

[数据结构与算法]leetcode98验证二叉搜索树刷题打卡

98. 验证二叉搜索树

题目描述

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

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

题解思路

本题我用了三种方法解题,分别是数组法,递归法,迭代法,他们的核心思想都是利用了二叉搜索树的中序遍历是一个递增的序列

  • 数组法,利用中序遍历,将每个节点的值放入一个数组,然后判断这个数组是否是递增的即可

    • class Solution {
      public:
          void inorder(TreeNode* root, vector<int> &v){
              if(!root) return;
              inorder(root->left, v);
              v.push_back(root->val);
              inorder(root->right, v);
          }
          bool isBST(vector<int> v){
              for(int i = 0; i < v.size() - 1; i++){
                  if(v[i] >= v[i+1]) return false;  // 如果有一个不是升序则返回false
              }
              return true;
          }
          bool isValidBST(TreeNode* root) {
              vector<int> v;
              inorder(root, v);  // 中序遍历将节点放入数组
              return isBST(v);  // 判断数组是否是升序
          }
      };
      
  • 递归法,整体代码神似中序的递归

    • class Solution {
      public:
          long maxval = LONG_MIN;
          bool isbst(TreeNode* root){
              if(!root) return true;
      
              bool left = isbst(root->left);
      
              if(maxval < root->val) maxval = root->val;
              else return false;
      
              bool right = isbst(root->right);
      
              return left && right;
          }
          bool isValidBST(TreeNode* root) {
              return isbst(root);
          }
      };
      
    • 使用LONG_MIN而不使用INT_MIN的原因是有一个测试用例[-2147483648],也就是INT_MIN,而在leetcode中LONG_MIN是-2^64,是比这个测试用例小的,所以替换成LONG_MIN可以

  • 迭代法,其实就是二叉树中序遍历的中序迭代遍历,这里我用的是统一迭代遍历法的中序遍历

    • lass Solution {
      public:
          long maxval = LONG_MIN;
          bool isValidBST(TreeNode* root) {
              stack<TreeNode*> s;
              if(!root) return true;
              s.push(root);
              while(!s.empty()){
                  TreeNode *cur = s.top();s.pop();
                  if(cur){
                      if(cur->right) s.push(cur->right);
                      s.push(cur);
                      s.push(NULL);
                      if(cur->left) s.push(cur->left); 
                  }else{
                      cur = s.top();
                      s.pop();
                      if(maxval < cur->val) maxval = cur->val;
                      else return false;
                  }
              }
              return true;
          }
      };
      
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 19:09:52  更:2022-07-20 19:13:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:40:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码