验证二叉搜索树
问题描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数;节点的右子树只包含大于当前节点的数;所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
解法一(递归):
看到这题我的第一反应肯定是递归:
public boolean isValidBST(TreeNode root) { //定义三个节点中、左、右 return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } public boolean isValidBST(TreeNode root, long minVal, long maxVal) { if (root == null) return true; //不满足条件直接false if (root.val >= maxVal || root.val <= minVal) return false; //递归下一层 return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal); }
解法二(递归):
//定义一个前驱节点 TreeNode prev; //中序遍历思想 public boolean isValidBST2(TreeNode root) { if (root == null) return true; //遍历左子树 if (!isValidBST2(root.left)) return false; if (prev != null && prev.val >= root.val) return false; prev = root; //遍历右子树 if (!isValidBST2(root.right)) return false; return true; }
解法三(迭代):
public boolean isValidBST1(TreeNode root) { //迭代的中序遍历 if (root == null)return true; Stack<TreeNode> stack =new Stack<>(); TreeNode pre = null; while (root != null||!stack.isEmpty()){ while (root!=null){ stack.add(root); root=root.left; } root=stack.pop(); if (pre != null && prev.val >= root.val) return false; pre = root; root = root.right; } return true; }
总结:
这题掌握中序遍历就很好做了,左子树小于根节点,右子树大于根节点。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix