欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

[Leedcode][JAVA][第98题][验证二叉搜索树]

发布时间:2023/12/10 编程问答 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 [Leedcode][JAVA][第98题][验证二叉搜索树] 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

【问题描述】[第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题][验证二叉搜索树]的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。