判断是不是二叉搜索树——牛客网
描述
给定一个二叉树根节点,请你判断这棵树是不是二叉搜索树。
二叉搜索树满足每个节点的左子树上的所有节点均严格小于当前节点且右子树上的所有节点均严格大于当前节点。
例:
图1
图2
数据范围:节点数量满足 1 \le n\le 10^4 \1≤n≤104 ,节点上的值满足 -2^{31} \le val \le 2^{31}-1\−231≤val≤231−1
示例1
输入:
{1,2,3}
返回值:
false
说明:
如题面图1
示例2
输入:
{2,1,3}
返回值:
true
说明:
如题面图2
递归版
private List<Integer> list = new ArrayList<>(); public boolean isValidBST (TreeNode root) { if (root == null) { return true; } boolean left = isValidBST(root.left); if (list.size() > 0 && root.val <= list.get(list.size() - 1)) { return false; } list.add(root.val); boolean right = isValidBST(root.right); return left && right; }
迭代版——栈模拟二叉树中序遍历
import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @return bool布尔型 * 迭代 */ public boolean isValidBST (TreeNode root) { // write code here Stack<TreeNode> stack = new Stack<>(); // 当前节点的前驱节点 TreeNode pre = null; while (!stack.isEmpty() || root != null) { // 1、一直走到当前树的左边界 while (root != null) { stack.push(root); root = root.left; } //2、取出栈顶元素,即当前树的最左边界节点,让其跟前驱节点进行比较,即当前节点在中序遍历得到的序列中是前驱节点的后继节点 TreeNode pop = stack.pop(); if (pre != null && pre.val > pop.val) { return false; } // 3、将当前节点的右节点设置为根节点继续重复第一个步骤(因为根据BST的定义:当前节点的右节点的值是比当前节点的父节点的值要小的) root = pop.right; // 4、将当前节点更新为前驱节点 pre = pop; } return true; } }
原题链接:https://www.nowcoder.com/practice/a69242b39baf45dea217815c7dedb52b?tpId=295&tqId=2288088&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
2021-05-29 线性筛选法求素数——模板