你题目出错了吧

369 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

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

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

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

示例 1:

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

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

二、思路分析:

看到这一题就觉得是一道简单题,只要递归进行判断就行了,首先如果根节点为null那么就一定是符合要求的搜索树,如果跟节点不为空,那么如果左右节点都为null也是符合的或者一遍为空或全部未null的时候只要符合root.left.val<root.val&&root.val<root.right.val就递归判读它的左右节点的就行了,否者就是假。于是写出了如下代码。

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isValidBST = function(root) {
    if(!root){
         return true;
    }else{
        if(!root.left&&!root.right){
            return true;
        }else{
            if((!root.left&&root.right&&(root.val<root.right.val))||(!root.right&&root.left&&(root.val>root.left.val))||(root.left&&root.right&&(root.left.val<root.val&&root.val<root.right.val))){
                return isValidBST(root.left)&&isValidBST(root.right)
            }else{
                return false;
            }
        }

    }
};

好似没问题但是过不了,怎么回事?这其实是踩坑了二叉搜索树是左子树的最大值小于当前节点值,右子树的最小值大于当前节点值。而不是简单的左节点小于,右节点大于。所以我们要换一种思维了,其实我们可以很快的发现把树转化成为数组来看的话就变得特别的简单。由于二叉搜索树的特点,那么我们对其进行中序遍历的时候得到的一定就是一个升序的数组,如果这个数组不是升序的,那么显然就不是一个合格的二叉搜索树了。 三、AC 代码:

代码一:

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isValidBST = function(root) {
    let res=[];
    function minSearch(root){
        if(!root){
            return;
        }
        root.left&&minSearch(root.left);
        res.push(root.val);
        root.right&&minSearch(root.right);
    }
    minSearch(root);
    console.log(res);
    for(let i=0;i<res.length-1;i++){
        if(res[i]>=res[i+1]){
            return false;
        }
    }
    return true;
};

四、总结:

有时候写题总是会遇到自己以为对了,但是一直都没有过的情况,这其实是自己对题目的理解还存在偏差,如果一直找不到错误那么应该去看看别人是否也遇到了同样的问题,避免浪费他太多的时间。