问题描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数;节点的右子树只包含大于当前节点的数;所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/
1 3
输出: true
示例 2:
输入:
5
/
1 4
/
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
解法一(递归):
看到这题我的第一反应肯定是递归:
public boolean isValidBST(TreeNode root) { //定义三个节点中、左、右 return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } public boolean isValidBST(TreeNode root, long minVal, long maxVal) { if (root == null) return true; //不满足条件直接false if (root.val >= maxVal || root.val <= minVal) return false; //递归下一层 return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal); }
解法二(递归):
//定义一个前驱节点 TreeNode prev; //中序遍历思想 public boolean isValidBST2(TreeNode root) { if (root == null) return true; //遍历左子树 if (!isValidBST2(root.left)) return false; if (prev != null && prev.val >= root.val) return false; prev = root; //遍历右子树 if (!isValidBST2(root.right)) return false; return true; }
解法三(迭代):
public boolean isValidBST1(TreeNode root) { //迭代的中序遍历 if (root == null)return true; Stack<TreeNode> stack =new Stack<>(); TreeNode pre = null; while (root != null||!stack.isEmpty()){ while (root!=null){ stack.add(root); root=root.left; } root=stack.pop(); if (pre != null && prev.val >= root.val) return false; pre = root; root = root.right; } return true; }
总结:
这题掌握中序遍历就很好做了,左子树小于根节点,右子树大于根节点。