【问题描述】[第98题][验证二叉搜索树][中等]

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

【解答思路】

1.中序遍历

中序遍历是二叉树的一种遍历方式,它先遍历左子树,再遍历根节点,最后遍历右子树。而我们二叉搜索树保证了左子树的节点的值均小于根节点的值,根节点的值均小于右子树的值,因此中序遍历以后得到的序列一定是升序序列。

时间复杂度:O(N) 空间复杂度:O(N)
1.1 递归

class Solution {long pre = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {if (root == null) {return true;}// 访问左子树if (!isValidBST(root.left)) {return false;}// 访问当前节点:如果当前节点小于等于中序遍历的前一个节点,说明不满足BST,返回 false;否则继续遍历。if (root.val <= pre) {return false;}pre = root.val;// 访问右子树return isValidBST(root.right);}
}

1.2 栈

class Solution {public boolean isValidBST(TreeNode root) {Stack<TreeNode> stack = new Stack();double inorder = - Double.MAX_VALUE;while (!stack.isEmpty() || root != null) {while (root != null) {stack.push(root);root = root.left;}root = stack.pop();// 如果中序遍历得到的节点的值小于等于前一个 inorder,说明不是二叉搜索树if (root.val <= inorder)return false;inorder = root.val;root = root.right;}return true;}
}
2. 递归

时间复杂度:O(N) 空间复杂度:O(N)

public boolean helper(TreeNode node, Integer lower, Integer upper) {if (node == null) return true;int val = node.val;if (lower != null && val <= lower) return false;if (upper != null && val >= upper) return false;if (! helper(node.right, val, upper)) return false;if (! helper(node.left, lower, val)) return false;return true;}public boolean isValidBST(TreeNode root) {return helper(root, null, null);}

【总结】

1. 二叉树遍历
  • 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点
  • 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点
  • 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输出当前结点的数据
2. 递归思想 想清楚子问题
3. 审题要全面 整体把握 分布思考清楚边界

[Leedcode][JAVA][第98题][验证二叉搜索树]相关推荐

  1. LeetCode 之 JavaScript 解答第98题 —— 验证二叉搜索树(Validate Binary Search Tree)

    Time:2019/4/24 Title: Vaildata Binary Search Tree Difficulty: Medium Author: 小鹿 题目:Vaildata Binary S ...

  2. Leetcode 98:验证二叉搜索树

    Leetcode 98:验证二叉搜索树 题目描述 我的解法:非递归的中序遍历 其它解法1:非递归的中序遍历,用LONG_MIN规避树的val等于INT_MIN的情况 其他解法2:递归的中序遍历思想 其 ...

  3. 【LeetCode】【HOT】98. 验证二叉搜索树(递归)

    [LeetCode][HOT]98. 验证二叉搜索树 文章目录 [LeetCode][HOT]98. 验证二叉搜索树 package hot;class TreeNode{int val;TreeNo ...

  4. leetcode98验证二叉搜索树刷题打卡

    98. 验证二叉搜索树 题目描述 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树. 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数. 节点的右子树只包含 大于 ...

  5. [CareerCup] 4.5 Validate Binary Search Tree 验证二叉搜索树

    4.5 Implement a function to check if a binary tree is a binary search tree. LeetCode上的原题,请参见我之前的博客Va ...

  6. 力扣 验证二叉搜索树

    力扣 验证二叉搜索树 题目描述 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树. 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数. 节点的右子树只包含 大于 ...

  7. 20190914:(leetcode习题)验证二叉搜索树

    验证二叉搜索树 题目 大致思路 代码实现 题目 大致思路 直接利用中序遍历的代码进行修改,将中序遍历按顺序存放入数组,按照中序的特点和二叉搜索树的特点,得到的数组应该是有序的,并且是升序的.最后进行判 ...

  8. 020.验证二叉搜索树

    题目链接: 98. 验证二叉搜索树 大概思路: 题目要求: 判断给的二叉树是不是二叉搜索树. 二叉搜索树的特征: 节点的左子树所有节点的值均小于该节点的值,右节点反之,同时对搜索树的每一个节点都适用此 ...

  9. 牛客题霸 [二叉搜索树的第k个结点]C++题解/答案

    牛客题霸 [二叉搜索树的第k个结点]C++题解/答案 题目: 给定一棵二叉搜索树,请找出其中的第k小的结点. 题解: 二叉搜索树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它 ...

最新文章

  1. SAP S4HANA BP事务代码初始界面的ROLE和Grouping配置
  2. 保护数据安全的三种武器
  3. spring依赖注入原理(转载)
  4. wxWidgets:显示如何从 DLL 使用 wx 的示例
  5. 鳄鱼洗澡安卓版关卡重置
  6. 部署应用程序到Tomcat的webapps目录
  7. 【熵】熵,KL散度,交叉熵,最大熵模型
  8. 1.VC弹出打开文件/保存文件/选择文件对话框
  9. easyui 隐藏input_Easyui-Datebox设置隐藏或者不可用如何解决
  10. 工业互联网平台基本架构
  11. 斗鱼直播分享html代码,用纯javascript实现斗鱼直播弹幕效果,代码也才这么点-优酷弹幕怎么设置...
  12. 一位华裔复活了美国奥数国家队:掌舵6年4次夺冠,打破中国队“垄断”
  13. 关于react-router-dom 6.0.1的基础写法 解决Error A <Route> is only ever to be used as the child of <Routes>
  14. P5023 填数游戏
  15. ssh-agent与ssh-sshd,开启ssh服务
  16. 股票交易接口开发原理是什么?
  17. Latex 编译报错: Misplaced omit.
  18. 八字易经算法之用JAVA实现二十八星宿算命
  19. 如何为WordPress的网站建立多级菜单?
  20. 宽带拨号上网时,Win10代理设置无效

热门文章

  1. 提升数据分析能力成熟度之四步曲_数据分析师
  2. 【转】使用Jmeter针对ActiveMQ JMS Point To Point压力测试
  3. 一款纯css3实现的超炫动画背画特效
  4. 不是每个人都可以坚持!
  5. 借口很多呀嘛接口也很多呀嘛态也很多
  6. 传统图片验证算法的缺点及改进(原理篇)
  7. sql注入攻击实例mysql_MySQL 处理SQL注入攻击
  8. Activity中 onResume和onPause与onStart()和onStop()的一些思考
  9. lab 常用配置参数 代码片段
  10. mpvue 从零开始 女友初成长 0