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. mybatis源码之我见

    以前一直想看mybatis的源代码,但是一直没找到入口(傻),最近看教程,有些感悟. 和起以前一样,关键代码我会用红色标记. 首先,先贴下我的dao和mapper,代码很简单,和平时写的hello w ...

  2. Spring官宣网传大漏洞,并提供解决方案

    Spring沦陷了!这样的标题这几天是不是看腻了?然而,仔细看看都是拿着之前的几个毫不相干的CVE来大吹特吹.所以,昨天发了一篇关于最近网传的Spring大漏洞的文章,聊了聊这些让人迷惑的营销文.以及 ...

  3. 11_二阶系统的单位阶跃响应_详细数学推导部分_2nd order system unit step response

  4. template7入门教程及对它的一些看法

    template7是framework7的内置模板引擎,在此之前使用过jquery-tmpl,不过刚刚打开github看了下,已经停止更新,并且将要被JsRender所替代.妹的,JsRender又是 ...

  5. CSS3 用border写 空心三角箭头 (两种写法)

    之前一直在寻找这种空心三角箭头, 终于知道了原理! 自己记录一下,顺便分享给之前跟我一样想要的撸友们~ 第一种写法 利用常见的 after伪元素 <!DOCTYPE html> <h ...

  6. 移动端——touch事件

    1.touchstart 当手指触碰屏幕时候触发 dom.addEventListener('touchstart',function(e){}); startX=e.touches[0].clien ...

  7. Codepen 每日精选(2018-3-24)

    按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以打开原始页面. 纯 css 画的抽象小鸟https://codepen.io/gregoryb/f... 纯 css 制作 ...

  8. python爬取京东评论

    一.分析 1.找到京东商品评论所在位置(记得点击商品评论,否则找不到productPageComments.action)  2.解析文件 打开后发现是json数据,但不是那么规范,所以需要去点前面的 ...

  9. Java JDK 动态代理实现和代码分析

    JDK 动态代理 内容 一.动态代理解析 1. 代理模式 2. 为什么要使用动态代理 3. JDK 动态代理简单结构图 4. JDK 动态代理实现步骤 5. JDK 动态代理 API 5.1 java ...

  10. springboot+mybatis实现数据分页(三种方式)

    项目准备 1.创建用户表 2.使用spring初始化向导快速创建项目,勾选mybatis,web,jdbc,driver 添加lombok插件 <?xml version="1.0&q ...