方法一,記錄子樹的上界和下界,root的左子樹一定小於root的值,root的右子樹一定大於root的值,然后遞歸左子樹和右子樹
public class Solution { public boolean isValidBST(TreeNode root) { return isValid(root, null, null); } public boolean isValid(TreeNode root, Integer min, Integer max) { if(root == null) return true; if(min != null && root.val <= min) return false; if(max != null && root.val >= max) return false; return isValid(root.left, min, root.val) && isValid(root.right, root.val, max); }
}
方法二,中序遍歷二叉樹,並記錄前繼節點
public class Solution { TreeNode prev = null; /** * 判斷一個樹是否為二叉搜索樹,使用中序遍歷,記錄前繼節點的值 * * @param root * @return */ public boolean isValidBST(TreeNode root) { if (root == null) return true; //首先找到最左節點的值 TreeNode left = root; while (left.left != null) { left = left.left; } prev = left; return isValid(root); } private boolean isValid(TreeNode root) { if (root == null) return true; if (!isValid(root.left)) return false; if (root != prev && root.val <= prev.val) return false; prev = root; return isValid(root.right); } }