首页 > 其他分享 >LeetCode 98.验证二叉搜索树

LeetCode 98.验证二叉搜索树

时间:2023-04-09 19:32:06浏览次数:55  
标签:right TreeNode val int 二叉 98 root LeetCode left

1.题目:

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

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

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

示例 1:

输入:root = [2,1,3] 输出:true

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/validate-binary-search-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


2.代码:

方法一:

思路

要知道中序遍历下,输出的二叉搜索树节点的数值是有序序列。

有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isValidBST(TreeNode root) {
        if(root==null) return true;//注意这里是返回true
        List<Integer> result = new ArrayList<>();
    method(root,result);
        
    for(int i=0;i<result.size()-1;i++){//判断集合是不是递增的,循环的范围也要注意
       if(result.get(i+1)<=result.get(i)){//注意这里是可以取等号的
           return false;
       }
    }
    return true;

    }
    public void method(TreeNode root, List<Integer> result){//递归中序遍历还是另外写一个方法吧,无返回值的方法
        if(root==null) return ;//注意这里只需要结束方法即可,不用返回值,方法本来就是不要返回值的
         method(root.left,result);//直接先左再右就行
         result.add(root.val);
        method(root.right,result);
    }
}


2.方法二:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
 //一边遍历一遍判断是否是递增的
class Solution {
    long min = Long.MIN_VALUE;//注意不要放到方法里面,不然每次递归都会重新给一个最小值!!!
    public boolean isValidBST(TreeNode root) {
        if(root==null) return true;
        boolean left = isValidBST(root.left);//左
        if(root.val>min){//中
            min=root.val;//只要遍历到的后一个结点比前一个大,就重新给min赋值
        }else {
            return false;//否则就直接返回false
        }
        boolean right = isValidBST(root.right);//右
        return left && right;

    }
}


方法三:指针

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
     TreeNode pre = null;//定义一个指针,先指向null,注意也是不能放在方法里面,不然的话每次递归都会弄到
    public boolean isValidBST(TreeNode root) {
        if(root==null) return true;
        boolean left = isValidBST(root.left);//左
        if(pre!=null && pre.val>=root.val){//中,注意这里的条件,既要不为null,而且是大于等于
            return false;
        } else{
            pre=root;//这里的是移动指针,下一层递归?root也是会自己移动的
        }
        boolean right = isValidBST(root.right);//右
        return left && right;

    }
}






标签:right,TreeNode,val,int,二叉,98,root,LeetCode,left
From: https://blog.51cto.com/u_15806469/6178932

相关文章

  • 二叉树层序遍历和之字遍历
    1.用一个队列记录当前层的节点,然后一个个取出,取出的同时将取出节点的儿子节点加入到队列中。2.之字遍历则需要一个标志为将行进行翻转ArrayList<Integer>(ArrayList<Integer>())res;flag=true;//实现奇数行翻转,偶数行不翻转Queuetemp;temp.offer(head)while(temp!=nul......
  • 判断完全二叉树
    1.题目链接天梯赛真题--是否是完全二叉搜索树2.根据节点编号判断(better)借鉴自这里规定根节点的编号为\(1\),左孩子节点编号为\(left\),右孩子节点编号为\(right\),父节点的节点编号为\(fa\),则有:\(left=fa<<1\)\(right=fa<<1|1\)由于完全二叉树的节点编号......
  • Leetcode(剑指offer专项训练)——DFS/BFS专项(2)
    课程顺序题目现在总共有numCourses 门课需要选,记为 0 到 numCourses-1。给定一个数组 prerequisites,它的每一个元素 prerequisites[i] 表示两门课程之间的先修顺序。 例如 prerequisites[i]=[ai,bi] 表示想要学习课程ai ,需要先完成课程bi 。请根据给出的......
  • 14.6二叉树的层序遍历实战
    function.h////Createdby93757on2023/3/21.//#ifndefINC_1_TREE_FUNCTION_H#defineINC_1_TREE_FUNCTION_H#include<stdio.h>#include<stdlib.h>typedefcharBiElemType;typedefstructBiTNode{BiElemTypec;//c就是书籍上的datastru......
  • leetcode56.合并区间-java
    1classSolution{2publicint[][]merge(int[][]intervals){3/*4思路:左区间排序,若intervals[i][0]>=intervals[i-1][1];则重叠5将重叠区间新建放入res数组里,没重叠则放入原数组6*/7List<int[]>......
  • 二叉树前序中序后序遍历实战
    function函数////Createdby93757on2023/3/21.//#ifndefINC_1_TREE_FUNCTION_H#defineINC_1_TREE_FUNCTION_H#include<stdio.h>#include<stdlib.h>typedefcharBiElemType;typedefstructBiTNode{BiElemTypec;//c就是书籍上的datastru......
  • 14.4二叉树层次建树
    创建function函数////Createdby93757on2023/3/21.//#ifndefINC_1_TREE_FUNCTION_H#defineINC_1_TREE_FUNCTION_H#include<stdio.h>#include<stdlib.h>typedefcharBiElemType;typedefstructBiTNode{BiElemTypec;//c就是书籍上的datast......
  • Leetcode(剑指offer专项训练)——DP专项(8)
    最长递增路径题目给定一个 mxn整数矩阵 matrix,找出其中最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。不能在对角线方向上移动或移动到边界外(即不允许环绕)。链接DP但是依旧不能覆盖所有的情况classSolution{public:intlongest......
  • 剑指 Offer 36. 二叉搜索树与双向链表
    题目链接:剑指Offer36.二叉搜索树与双向链表方法一:回溯解题思路代码classSolution{private:intmx=INT_MIN,mi=INT_MAX;Node*start=NULL,*end=NULL;public:voidLrotate(Node*root,Node*last_root){//针对左子树,左旋if(!ro......
  • 剑指 Offer 37. 序列化二叉树
    题目链接:剑指Offer37.序列化二叉树取巧做法classCodec{private:TreeNode*root;public://Encodesatreetoasinglestring.stringserialize(TreeNode*root){this->root=root;return"";}//Decodesyourencoded......