菜鸡每日一题系列打卡98天
每天一道算法题目
小伙伴们一起留言打卡
坚持就是胜利,我们一起努力!
题目描述(引自LeetCode)
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
题目分析
二叉搜索树是一种递归定义的数据结构,它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。
不熟悉二叉搜索树性质的小伙伴可以看菜鸡的算法修炼——二叉搜索树(二叉搜索树与双向链表)进行学习。
根据二叉搜索树的定义,容易想到采用递归的方式进行验证。而如果考虑二叉搜索树的性质,不难发现,其中序遍历是升序的,因此,我们可以采用中序遍历的方式进行验证。
为了给大家提供不同的思路,菜鸡在本文中将采用上述两种方式进行解答。话不多说,上代码!
代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
// 递归
class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean isValidBST(TreeNode root, long min, long max){
if(root == null) return true;
if(root.val <= min || root.val >= max) return false;
return isValidBST(root.left, min, root.val) && isValidBST(root.right, root.val, max);
}
}
// 中序遍历
class Solution {
public boolean isValidBST(TreeNode root) {
Stack<TreeNode> stack = new Stack();
long flag = Long.MIN_VALUE;
// 中序遍历,并更新flag值
while (!stack.isEmpty() || root != null) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
if (root.val <= flag) return false;
flag = root.val;
root = root.right;
}
return true;
}
}
代码分析
对代码进行分析:
递归:程序至多访问二叉树的每个结点一次,时间复杂度为O(n),递归调用需要占用额外的栈空间,空间复杂度为O(n)。
中序遍历:程序至多访问二叉树的每个结点一次,时间复杂度为O(n),采用栈的数据结构进行数据存储,在最坏情况下(二叉树退化为链表),空间复杂度为O(n)。
执行结果
递归的执行结果
中序遍历的执行结果
学习 | 工作 | 分享
????长按关注“有理想的菜鸡”
只有你想不到,没有你学不到