当前位置: 首页 > news >正文

跟着小码学算法Day21:验证二叉搜索树

一、二叉搜索树(BST)的定义

  • 对于任意节点 node

    • 其 左子树中所有节点的值 必须 严格小于 node.val

    • 其 右子树中所有节点的值 必须 严格大于 node.val

    • 左右子树也必须是 BST

注意:不是只比较当前节点和左右孩子!


例如下面这棵树不是 BST:

    5/ \1   6/ \3   7   ← 3 < 5,违反了“右子树所有节点 > 根”的规则

二、算法思想与模板

1,上下界约束法(自顶向下递归)

  • 思想:每个节点的值都必须落在一个合法区间 (min, max) 内。
    • 根节点:区间为 (-∞, +∞)
    • 左子节点:区间变为 (-∞, root.val)
    • 右子节点:区间变为 (root.val, +∞)
    • 递归传递边界
  • 实现:递归函数 isValid(node, min, max)

实例:

class Solution {public boolean isValidBST(TreeNode root) {return dfs(root, null, null);}private boolean dfs(TreeNode node, Integer min, Integer max) {if (node == null) return true;if (min != null && node.val <= min) return false;if (max != null && node.val >= max) return false;return dfs(node.left, min, node.val) && dfs(node.right, node.val, max);}
}

2,中序迭代

  • 思想:BST 的中序遍历结果一定是 严格递增序列

  • 验证方法:在遍历过程中,记录前一个访问的节点值(或引用),检查是否 pre >= current,若是则非法。

// 使用普通迭代中序遍历(非统一写法,更稳定)
class Solution {public boolean isValidBST(TreeNode root) {Stack<TreeNode> stack = new Stack<>();TreeNode curr = root;TreeNode pre = null;while (curr != null || !stack.isEmpty()) {while (curr != null) {stack.push(curr);curr = curr.left;}curr = stack.pop();if (pre != null && pre.val >= curr.val) return false;pre = curr;curr = curr.right;}return true;}
}

三、典型例题

98. 验证二叉搜索树 - 力扣(LeetCode)

class Solution {public boolean isValidBST(TreeNode root) {if (root == null) return true;Stack<TreeNode> stack = new Stack<>();TreeNode pre = null;stack.push(root);while (!stack.isEmpty()) {TreeNode curr = stack.peek();if (curr != null) {stack.pop();// 入栈顺序:右 → 中 → null → 左if (curr.right != null) stack.push(curr.right);stack.push(curr);      // 中stack.push(null);      // 标记if (curr.left != null) stack.push(curr.left); // 左(不是 curr!)} else {stack.pop();           // 弹出 nullTreeNode node = stack.pop(); // 弹出实际节点if (pre != null && pre.val >= node.val) {return false;}pre = node;}}return true;}
}

http://www.dtcms.com/a/590216.html

相关文章:

  • wordpress外汇主题wordpress 网站优化
  • 邮箱合法性判断【Java】
  • 苏州做网站费用网页设计与应用
  • 上传网站流程怎么做淘客手机网站
  • 深圳网站关键字优化网页设计怎么把图片上移
  • 微信授权登录第三方网站开发设计师建站网站
  • C++数据结构实战:二叉搜索树的核心操作与应用场景
  • 可以下载的建站网站有必要买优化大师会员吗
  • 微网站免费模板建站公司主要做那些业务
  • KingbaseES权限隔离深度解析:从MySQL的遗憾到安全增强的革新之路
  • 格力网站的建设情况邢台做网站哪家便宜
  • pythob编程能力测试备考
  • 泉州快速优化排名广州seo排名优化服务
  • equals和==的区别
  • 搭建租号网的网站如何在建设厅网站搜索企业
  • 域名解析记录值填什么杭州小周seo
  • 医院做网站是最简单的前端吗vs2019怎么创建网站
  • 手表网站排名大全吉林省建设安全信息网官网
  • 嘉定企业网站开发做网站 计算机有交嘛
  • 商城网站设计一站式服务如何制作网址内容
  • voice_control_smart_car(语音控制智能小车)
  • 如何做1个手机网站宜宾网站建设价格
  • ‘pyinstaller‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  • 2025年11月9日互联网技术热点TOP3及影响分析(乌镇核心消息)
  • 可以做问答的网站开题报告旅游网站建设
  • 公司的建设网站公司wordpress 首页显示文章数量
  • 郑州网站建设炉石wordpress 关闭feed
  • FPGA教程系列-Vivado中实现简单正弦波
  • 什么可以放置网站内容建工网论坛
  • 龙岩网站定制衡水seo营销