每日一题——验证二叉搜索树

138 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情

题目描述

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

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

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

示例 1:

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

示例 2:

输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。

提示:

树中节点数目范围在[1, 104] 内 -231 <= Node.val <= 231 - 1 通过次数485,247提交次数1,351,185

思路

本题主要考察深度优先遍历搜索。中心思想就是利用深度优先遍历对一棵树进行中序搜索,然后判断其中序搜索后的结果是否是一个上升的数组即可。如果是那么就返回true,否则返回fasle;这里你可以利用一个数组存储所有搜寻到的结果,最后在对其判断,也可以使用一个变量进行存储,在递归到根节点的最后一个左子节点就可以用pre进行判断,然后pre保存为本节点的值。

这里说下我的错误思路,刚开始我是想对每一个顶点,判断其左孩子是不是比它小,左孩子是否比它大。

image.png

但这样是不能完整通过题目的,错误样例如下,这样判断的方式不能保证每个节点是个搜索树。

image.png

代码

答案代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool res = true;
    long long pre = -2147483650;
    bool isValidBST(TreeNode* root) {
        
        if(root == nullptr) return true;
        if(!isValidBST(root->left))
        {
            return false;
        }
        if(pre >= root-> val) return false;
        pre = root->val;
        return isValidBST(root->right);
​
​
    }
};