题目概述(中等难度)
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3] 输出:true
示例2:
输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。
题目链接:
点我进入leetcode
思路与代码
思路展现
就是采用中序遍历的思路来解就可,我们采用一个list集合将每次中序遍历得到的元素存储到我们的list集合当中,此时需要注意了,如果此时的二叉树是一个二叉搜索树,那么经历过中序遍历后的存入到集合中的元素的值一定是递增的,所以最后只需要判断我们list集合中所存储的值是否是递增的,如果是递增的,返回true,否则返回false.
代码示例
class Solution { List<Integer> res = new ArrayList<>(); public void inorder(TreeNode root) { if(root == null) { return; } inorder(root.left); res.add(root.val); inorder(root.right); } public boolean isValidBST(TreeNode root) { if(root == null) { return true; } inorder(root); for(int i = 0;i<res.size()-1;i++) { if(res.get(i)>=res.get(i+1)) { return false; } } return true; } }
时间复杂度 : O(n),其中 n 为二叉树的节点个数。二叉树的每个节点最多被访问一次,因此时间复杂度为 O(n)。
空间复杂度 : O(n),其中 n 为二叉树的节点个数。最多存储 n 个节点,因此需要额外的 O(n)的空间。
总结
这道题目是对中序遍历一次很好的使用详解,大家可以反复琢磨下.