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

LeetCode 98. 验证二叉搜索树

时间:2023-05-29 18:13:13浏览次数:39  
标签:return 节点 98 func TreeNode 二叉 root LeetCode

题目链接:LeetCode 98. 验证二叉搜索树

题意:

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

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

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

解题思路:

递归法1

由二叉搜索树的性质可知,中序遍历的结果是有序的,因此可以利用这个性质来判断当前二叉树是否是二叉搜索树。

代码:

var res []int //存放二叉树中所有节点中序遍历的值 
func isValidBST(root *TreeNode) bool {
    res = []int{}
    dfs(root)
    for i:=1;i<len(res);i++{
        if res[i] <= res[i-1]{
            return false
        }
    }
    return true
}
func dfs(root *TreeNode){
    if root == nil {
        return 
    }
    dfs(root.Left)
    res = append(res,root.Val)
    dfs(root.Right)
}

这道题目比较容易陷入两个陷阱:

陷阱1
不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了。

写出了类似这样的代码:

if (root->val > root->left->val && root->val < root->right->val) {
    return true;
} else {
    return false;
}

我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点。所以以上代码的判断逻辑是错误的。
陷阱2
样例中最小节点 可能是int的最小值,如果这样使用最小的int来比较也是不行的。

此时可以初始化比较元素为longlong的最小值。

递归法2

中序遍历二叉树,判断当前节点的值是否严格大于前一个结点

func isValidBST(root *TreeNode) bool {
    var pre *TreeNode // 用来记录中序遍历时的前一个节点
    var travel func(root *TreeNode)bool

    travel = func(root *TreeNode)bool{
        if root == nil {
            return true
        }
        left := travel(root.Left)

        if pre != nil && pre.Val >= root.Val{
            return false
        } 
        pre = root; 
        right := travel(root.Right)
        return left && right
    }
    return travel(root)
}

LC示例代码

func isValidBST(root *TreeNode) bool {
    // 由题目中的数据限制可以得出min和max
    return check(root,math.MinInt,math.MaxInt)
}

func check(node *TreeNode,min,max int) bool {
    // 二叉搜索树也可以是空树
    if node == nil {
        return true
    }
    if min >= node.Val || max <= node.Val {
        return false
    }
    // 分别对左子树和右子树递归判断,如果左子树和右子树都符合则返回true
    return check(node.Right,node.Val,max) && check(node.Left,min,node.Val)
}

标签:return,节点,98,func,TreeNode,二叉,root,LeetCode
From: https://www.cnblogs.com/lxing-go/p/17441259.html

相关文章

  • 二叉排序链表C语言代码实现
    #include<stdio.h>#include<stdlib.h>#include<stdbool.h>typedefstructBSTNode{intdata;structBSTNode*lchild;structBSTNode*rchild;}BSTNode,*BSTree;BSTNode*InitNode(intdata){BSTNode*node=(BSTNode......
  • LeetCode 700. 二叉搜索树中的搜索
    题目链接:LeetCode700.二叉搜索树中的搜索题意:给定二叉搜索树(BST)的根节点 root 和一个整数值 val。你需要在BST中找到节点值等于 val 的节点。返回以该节点为根的子树。如果节点不存在,则返回 null 。解题思路:递归法递归遍历二叉树,寻找与val相等的节点,找到即返回......
  • leetcode1657vector的初始化和比较
    满足相似的条件:1.长度一样2.组成的字母组合相同3.每个组成字母的个数集合相同比较两个vector,直接用==/!=排序vectorsort(迭代器1,迭代器2);初始化vector形式:vector<类型>name(形式)if(word1.lenth()!=word2.length())returnfalse;//长度不同vector<int>v2(26,0),v1(2......
  • LeetCode 617. 合并二叉树
    题目链接:LeetCode617.合并二叉树题意:给你两棵二叉树:root1和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新......
  • 二叉排序树的三种遍历方式和实现源代码
    二叉排序树(BinarySearchTree)是一种特殊的二叉树,它满足以下性质:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。这种特性使得对于二叉排序树的遍历具有一定的规律。前序遍历(PreorderTraversal)是一种遍历二叉树的方法。......
  • 代码随想录算法训练营第二十天|654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树
    【参考链接】654.最大二叉树【注意】1.构造二叉树,都需要用前序遍历。2.二叉树的根是数组中的最大元素。3.没必要构造新数组,通过下标控制左右区间。运行效率会高很多。【代码】1#Definitionforabinarytreenode.2#classTreeNode(object):3#def__init......
  • 【LeetCode双向链表】LRU详解,双向链表实战
    LRU缓存请你设计并实现一个满足LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intkey,intvalu......
  • #yyds干货盘点# LeetCode程序员面试金典:填充每个节点的下一个右侧节点指针
    题目:给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:structNode{ intval; Node*left; Node*right; Node*next;}填充它的每个next指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将next指针设置为NUL......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉搜索树迭代器
    1.简述:实现一个二叉搜索树迭代器类BSTIterator,表示一个按中序遍历二叉搜索树(BST)的迭代器:BSTIterator(TreeNoderoot)初始化BSTIterator类的一个对象。BST的根节点root会作为构造函数的一部分给出。指针应初始化为一个不存在于BST中的数字,且该数字小于BST中的任何元素。b......
  • LeetCode 周赛 347(2023/05/28)二维空间上的 LIS 最长递增子序列问题
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。往期回顾:LeetCode单周赛第346场·仅68人AK的最短路问题周赛347概览T1. 移除字符串中的尾随零(Easy)标签:模拟、字符串T2.对角线上不同值的数量差(Easy)标签:前后缀分解T3.使所有字符......