判断是不是二叉搜索树——牛客网

描述

给定一个二叉树根节点,请你判断这棵树是不是二叉搜索树。
 
二叉搜索树满足每个节点的左子树上的所有节点均严格小于当前节点且右子树上的所有节点均严格大于当前节点。
 
例:
图1
图2
 
数据范围:节点数量满足 1 \le n\le 10^4 \1n104  ,节点上的值满足 -2^{31} \le val \le 2^{31}-1\231val2311 

示例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

posted @   没有你哪有我  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
历史上的今天:
2021-05-29 线性筛选法求素数——模板
点击右上角即可分享
微信分享提示