一起养成写作习惯!这是我参与「掘金日新计划 · 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保存为本节点的值。
这里说下我的错误思路,刚开始我是想对每一个顶点,判断其左孩子是不是比它小,左孩子是否比它大。
但这样是不能完整通过题目的,错误样例如下,这样判断的方式不能保证每个节点是个搜索树。
代码
答案代码如下:
/**
* 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);
}
};