首页 > 其他分享 >验证二叉搜索树-力扣

验证二叉搜索树-力扣

时间:2024-06-12 13:29:47浏览次数:17  
标签:right TreeNode val 验证 nullptr 二叉 力扣 root left

第一次做这道题时,想的解法是递归去判断比较左节点小于中间节点,右节点大于中间节点,而这恰恰进入了陷阱,这道题不仅仅是判断子树是否左节点小于中间节点,右节点大于中间节点;要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点。附上错误代码:

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        if(root == nullptr){
            return true;
        }
        bool isTrue = 0;
        if(root->left == nullptr && root->right == nullptr){
            isTrue = true;
        }else if(root->left == nullptr && root->val < root->right->val){
            isTrue = true;
        }else if(root->right == nullptr && root->val > root->left->val){
            isTrue = true;
        }else if(root->left != nullptr && root->right != nullptr && root->val < root->right->val && root->val > root->left->val){
            isTrue = true;
        }else{
            isTrue = false;
        }
        return isTrue && isValidBST(root->left) && isValidBST(root->right);
    }
};

正确的递归应该是使用中序遍历的顺序,挨个比较两两大小,是否满足二叉搜索树的性质,这里利用一个全局变量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:
    TreeNode* pre = NULL;
    bool isValidBST(TreeNode* root) {
        if (root == NULL) return true;
        bool left = isValidBST(root->left);

        if (pre != NULL && pre->val >= root->val) return false;
        pre = root;

        bool right = isValidBST(root->right);
        return left && right;
    }
};

也可以使用中序遍历得到一个数组,然后遍历这个数组,如果这个数组是递增的,则这个树二叉搜索树。

class Solution {
private:
    vector<int> vec;
    void traversal(TreeNode* root) {
        if (root == NULL) return;
        traversal(root->left);
        vec.push_back(root->val); // 将二叉搜索树转换为有序数组
        traversal(root->right);
    }
public:
    bool isValidBST(TreeNode* root) {
        vec.clear(); // 不加这句在leetcode上也可以过,但最好加上
        traversal(root);
        for (int i = 1; i < vec.size(); i++) {
            // 注意要小于等于,搜索树里不能有相同元素
            if (vec[i] <= vec[i - 1]) return false;
        }
        return true;
    }
};

标签:right,TreeNode,val,验证,nullptr,二叉,力扣,root,left
From: https://blog.csdn.net/why_12134/article/details/139623719

相关文章

  • 力扣面试题 02.07. 链表相交
    一 题目:二思路:本题介绍两种思路解题,个人推荐思路一快速好理解 思路一: 1.先把其中一个链表的值变成负数 2.遍历另一个链表第一个出现负数的值就是交点 3.还原被改的链表 思路二:1.先用第一个链表的头节点head1搜索指针q遍历第一个链表直到为空,再把q放到head2......
  • 五分钟“手撕”二叉树
    代码放开头,供大家查阅。但是对于树来说,更重要的是理解树的概念,树的概念很多,题却是千篇一律,这篇博客详细的讲解了概念,看完必有很大的收获。 目录一、实现代码二、什么是树三、树的重要概念四、什么是二叉树 二叉树概念:特殊的二叉树: 1.满二叉树:2.完全二叉树:......
  • JDBC连接SQL Server(Windows身份验证)
    1.IDEA查看JDK版本2.根据JDK版本查看适合MicrosoftJDBCDriver 的版本系统要求-JDBCDriverforSQLServer|MicrosoftLearn3.下载下载-JDBCDriverforSQLServer|MicrosoftLearn下载早期版本 4.连接前准备a.计算机管理中如图启用所有协议,将其中一个I......
  • 路径总和-力扣
    本题想到的解法是对二叉树进行深度搜索,并记录路径和,当节点为叶子节点时,将路径和与目标值进行判断,如果相等则返回true,否则返回false,最后返回左右子树或的值即可,因为只需有一条满足条件就可以。/***Definitionforabinarytreenode.*structTreeNode{*intv......
  • 左叶子之和-力扣
    本题计算二叉树的左叶子之和,使用后序遍历的顺序对二叉树进行深度搜索,关键点在于,对左叶子节点的值的操作上,需要在左叶子节点的父节点进行。/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right......
  • c# 正则表达式验证"身份证","手机号","邮箱地址","邮编"
    publicstaticclassVerify{///<summary>///验证手机号码///</summary>///<paramname="str_handset"></param>///<returns></returns>publicstaticboolIsHandset(stringstr_handset)......
  • CSP历年复赛题-P5018 [NOIP2018 普及组] 对称二叉树
    原题链接:https://www.luogu.com.cn/problem/P5018题意解读:找到是对称二叉树的最大子树节点数。解题思路:1、先统计每一个节点为子树的节点数intdfs1(introot){if(root==-1)return0;returncnt[root]=dfs1(tree[root].l)+dfs1(tree[root].r)+1;}2、再......
  • 合法二叉搜索树
    题目链接合法二叉搜索树题目描述注意点无解答思路第一个思路是将中序遍历,并将遍历到的节点的值存储到队列中,根据队列先进先出的特点将每次弹出的元素与其前面的值进行比较,如果队列是按照从小到大进行排序的,说明该树是合法二叉搜索树第二个思路是递归,从根节点开始,每......
  • 二叉树相关算法题汇总-go语言实现
    总结先序中序后序遍历就能解决一些算法题。层次遍历使用队列。从左子树、右子树获取答案,然后结合根节点来计算答案。前缀树,比Hashset更稳定。O(1),只不过占内存。trie树。递归。递归,递归。到叶子节点收集答案。然后移除路径。packagemainimport( "fmt" "math......
  • Windows系统 在VirtualBox虚拟机上安装搭建OpenEuler操作系统 并用Putty验证是否创建
    目录1.配置虚拟化环境步骤1进入BIOS,开启CPU虚拟化技术,不同电脑开启方式有所不同步骤2下载并安装VirtualBox/VMWare。按照学校给的实验指导书,这里我下载的是VirtualBox(我的电脑是我前段时间自己重新配的win11系统)步骤3 下载openeuler操作系统,在网页搜索openeuler下......