赞
踩
力扣98题:https://leetcode-cn.com/problems/validate-binary-search-tree/
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
按照二叉搜索树的性质,我们可以想到需要递归地进行判断。这里需要注意的是,如果二叉搜索树的左右子树不为空,那么左子树中的所有节点,值都应该小于根节点;同样右子树中所有节点,值都大于根节点。
容易想到的方法是,用先序遍历的思路,自顶向下进行遍历。对于每一个节点,先判断它的左右子节点,和当前节点值是否符合大小关系;然后再递归地判断左子树和右子树。
这里需要注意,仅有当前的节点作为参数,做递归调用是不够的。当前节点如果是父节点的左子节点,那么以它为根的子树所有节点值必须小于父节点;如果是右子节点,则以它为根的子树所有节点值必须大于父节点。所以我们在递归时,还应该把取值范围的“上下界”信息传入。
代码演示如下:
// 方法一:先序遍历 public boolean isValidBST1(TreeNode root){ if (root == null) return true; return validator(root, null, null); } // 定义一个辅助校验器,用来传入上下界递归调用 public boolean validator(TreeNode root, Integer lowerBound, Integer upperBound){ if (root == null) return true; // 1. 判断当前节点的值是否在上下界范围内,如果超出直接返回false if (lowerBound != null && root.val <= lowerBound) return false; if (upperBound != null && root.val >= upperBound) return false; // 2. 递归判断左右子树 return validator(root.left, lowerBound, root.val) && validator(root.right, root.val, upperBound); }
复杂度分析
我们知道,对于二叉搜索树,左子树的节点的值均小于根节点的值,根节点的值均小于右子树的值。因此如果进行中序遍历,得到的序列一定是升序序列。所以我们的判断其实很简单:进行中序遍历,然后判断是否每个值都大于前一个值就可以了。
代码如下:
// 定义一个列表 ArrayList<Integer> inOrderArray = new ArrayList<>(); // 方法二:中序遍历 public boolean isValidBST(TreeNode root){ // 1.中序遍历,得到升序数组 inOrder(root); // 2. 遍历数组,判断是否升序 for (int i = 0; i < inOrderArray.size(); i++){ if (i > 0 && inOrderArray.get(i) <= inOrderArray.get(i-1)) return false; } return true; } // 实现一个中序遍历的方法 public void inOrder(TreeNode root){ if (root == null) return; inOrder(root.left); inOrderArray.add(root.val); inOrder(root.right); }
复杂度分析
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。