leetcode题目 98. 验证二叉搜索树

前序遍历

最简洁的答案版本,由于先判断的是根节点,所以直接判断当前root的值v,是否满足大于左子树最大,小于右子树最小,然后再遍历左子树,右子树是否是这样

func isValidBST(root *TreeNode) bool {
return dfs(root,math.MinInt64,math.MaxInt64)
} func dfs(root *TreeNode,min float64,max float64) bool {
if root == nil {
return true
}
v := float64(root.Val)
if v > min && v < max && dfs(root.Left,min,v) && dfs(root.Right,v,max) { // 'min'是右子树最小,因为'dfs(root.Right,v,max)'遍历时'max'保持不变,发生回溯后不断把较小v(因为v必须比右子树小)回溯,同理'max'是左子树最大
return true
}else {
return false
}
}

后续遍历

最开始我参考 110. 平衡二叉树 的做法,想进行后续遍历解法,一直失败,后来根据前序遍历的经验才得到结果

根据注释,可以清楚看到和前序的异曲同工之妙

func isValidBST(root *TreeNode) bool {
ok,_,_ := judge(root)
return ok
} func judge(root *TreeNode) (bool,int,int){// 利用go的多返回值向上传递,与前序遍历到结束时回溯相反
if root == nil {
return true,math.MinInt64,math.MaxInt64
}
lok,lmax,lmin := judge(root.Left) // 得到左子树中最大最小的值以及是否符合搜索二叉
rok,rmax,rmin := judge(root.Right)// 得到右子树中最大最小的值以及是否符合搜索二叉
if lok == true && rok == true && root.Val > lmax && root.Val < rmin {
// 检查当前根是否大于左子树中最大值,小于右子树最小值
if lmin > root.Val {
lmin = root.Val
// 由于当前根的值是当前树中最小的(因为左子树最小值已经是最小的了)
}
if rmax < root.Val {
rmax = root.Val
// 由于当前根的值是当前树中最大的
}
return true,rmax,lmin //判断是一个搜索二叉树,返回当前最大,最小值
}else {
return false,0,0
}
}

如何破解此类需要递推的题

我提供一个思路:考虑最极端的情况。例如这道题中,

前序遍历,由于是根左右的顺序,我们的操作肯定是对根操作的(因为根是当前的实体),那么极端情况就是,最大的根,于是我们考虑了判断当前root的值v,是否满足大于左子树最大,小于右子树最小,然后再去遍历左右,直到结尾开始回溯,得到答案

后续遍历,由于是左右根的顺序,那么左右肯定在不断遍历,直到最结尾,我们找到了最后一个不是nil的根,我们对他做判断,然后把结果向上传递,得到答案

98. 验证二叉搜索树 前序遍历解法以及后续遍历解法(go语言)的更多相关文章

  1. 【LeetCode】98. 验证二叉搜索树

    98. 验证二叉搜索树 知识点:二叉树:递归 题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大 ...

  2. LeetCode 98. 验证二叉搜索树 | Python

    98. 验证二叉搜索树 题目来源:https://leetcode-cn.com/problems/validate-binary-search-tree 题目 给定一个二叉树,判断其是否是一个有效的 ...

  3. Java实现 LeetCode 98 验证二叉搜索树

    98. 验证二叉搜索树 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右 ...

  4. 力扣Leetcode 98. 验证二叉搜索树

    验证二叉搜索树 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身 ...

  5. LeetCode 98 验证二叉搜索树

    题目: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是 ...

  6. Leetcode 98 验证二叉搜索树 Python实现

    给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...

  7. LeetCode 98——验证二叉搜索树

    1. 题目 2. 解答 2.1. 方法一 我们初始化根节点的范围为长整形数据的最小最大值 \([LONG\_MIN,LONG\_MAX]\),则其左子节点的取值范围为 \([LONG\_MIN,根节点 ...

  8. Leetcode题目98.验证二叉搜索树(递归-中等)

    题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数.节点的右子树只包含大于当前节点的数.所有左子树和右子树自身必须也是 ...

  9. LeetCode 98. 验证二叉搜索树(Validate Binary Search Tree)

    题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也 ...

随机推荐

  1. 若没有任何实例包含Class Body 则enum被隐式声明为final

    本文参考 今天在Java Language Specification上偶然看到一条关于枚举的语法特点说明 An enum declaration is implicitly final unless ...

  2. 制作任意波形发生器MAX038

  3. 高速PCB设计名词解析

    1.吸芯效应 "芯吸效应"是超细纤维特有的性能,是指超细纤维中孔细,接近真空时,近水端纤维管口与水分子接触形成纤维中真空孔隙,此时大气压值超过纤维内部的真空,水就自然压积进入纤维孔 ...

  4. 解决SVG animation 在IE中不起作用

    问题描述 CSS animation没办法解决SVG路径运动的问题,下图路径运动的过程,通过查资料发现所有的IE的版本都不支持SVG animation.在IE中没有水流动的效果. 主要代码 < ...

  5. MongoDB从bson文件中恢复数据

    首先需要到mangodb的安装目录的bin下面找到mongorestore.exe WIN10系统MongoDB安装目录bin文件夹下没有mongorestore.exe 先下载工具  https:/ ...

  6. java中请给一个Abstract类实现接口的实例!

    2.Abstract类实现接口 马克-to-win:如果实现某接口的类是abstract类,则它可以不实现该接口所有的方法.但其非abstract的子类中必须拥有所有抽象方法的实在的方法体:(当然它a ...

  7. Android设置TextView为不可见

    通常控件的可见与不可见分为三种情况. 第一种    gone         表示不可见并且不占用空间 第二种    visible       表示可见 第三种    invisible    表示 ...

  8. 一个抽取百度定位的教程(下载百度地图Demo+配置+抽取)

    效果展示 已经下载Demo的可以直接到第五步,已经配置好的并可以运行的可以直接到第七步. 1.在浏览器搜索 " 百度定位API ",点击下面这个链接 2.翻到最下面找到并点击 &q ...

  9. flex布局图片和文字同级,文字过多导致图片变形问题

    图片增加css样式即可 flex-grow: 0;flex-shrink: 0;

  10. 在 M1 Mac 上开发 .NET MAUI (iOS)

    在 M1 Mac 上开始使用 .NET MAUI 开发 (iOS) 的最简单方法. .NET 多平台应用程序 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动 ...