题目:
https://leetcode-cn.com/problems/legal-binary-search-tree-lcci/
实现一个函数,检查一棵二叉树是否为二叉搜索树。
示例 1:
输入:
2
/
1 3
输出: true
示例 2:
输入:
5
/
1 4
/
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
分析:
两种做法,利用二分搜索树中序遍历的性质,节点val值的顺序应该是严格递增的。可以每遍历到一个节点就和上一个节点比较,如果符合条件就继续。
第二种由于二分搜索树的性质其根节点右子树的所有节点值都应该大于根节点,左子树的节点值应该小于根节点,基于这个条件我们可以维护一个最大值最小值区间,去递归判断每一个节点是否符合要求。
判断左子树时就将区间最小值改为当前结点的值,判断右子树时就将区间最大值修改为当前结点的值即可。
程序:
/** * 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) { isValid(root); return res; } private void isValid(TreeNode node){ if(node == null) return; isValid(node.left); if(v == null) v = node.val; else if(v >= node.val){ res = false; return; }else{ v = node.val; } isValid(node.right); } private Integer v; private boolean res = true; }
class Solution { public boolean isValidBST(TreeNode root) { return isValid(root, Long.MIN_VALUE, Long.MAX_VALUE); } private boolean isValid(TreeNode node, long min, long max){ if(node == null) return true; if(node.val > min && node.val < max) return isValid(node.left, min, node.val) && isValid(node.right, node.val, max); return false; } }