LeetCode 98.验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
思路:
二叉搜索树在中序遍历的顺序下,输出的值是有序的。问题就可以转换为,在中序遍历输出的顺序是否有序的问题。
不能单纯比较左节点小于根节点,右节点大于根节点。二叉搜索手,左子树和右子树的所有数值都需要小于根节点。
所以要遍历到尾部在返回的到左子树的根节点的时候进行大小的判断。
样例中最小节点 可能是int的最小值,如果这样使用最小的int来比较也是不行的。
此时可以初始化比较元素为longlong的最小值。
递归三部曲:
由于我们这题是判断是否是二叉搜索树,所以返回boolean类型的值就可以了。
终止条件:遍历到节点为空
单层递归逻辑:
一直更新maxVal,一旦返现val的值不符合就返回flase
class Solution { // 递归 TreeNode max; public boolean isValidBST(TreeNode root) { if (root == null) { return true; } // 左 boolean left = isValidBST(root.left); if (!left) { return false; } // 中 if (max != null && root.val <= max.val) { return false; } max = root; // 右 boolean right = isValidBST(root.right); return right; } } class Solution { // 迭代 public boolean isValidBST(TreeNode root) { if (root == null) { return true; } Stack<TreeNode> stack = new Stack<>(); TreeNode pre = null; while (root != null || !stack.isEmpty()) { while (root != null) { stack.push(root); root = root.left;// 左 } // 中,处理 TreeNode pop = stack.pop(); if (pre != null && pop.val <= pre.val) { return false; } pre = pop; root = pop.right;// 右 } return true; } } // 简洁实现·递归解法 class Solution { public boolean isValidBST(TreeNode root) { return validBST(Long.MIN_VALUE, Long.MAX_VALUE, root); } boolean validBST(long lower, long upper, TreeNode root) { if (root == null) return true; if (root.val <= lower || root.val >= upper) return false; return validBST(lower, root.val, root.left) && validBST(root.val, upper, root.right); } } // 简洁实现·中序遍历 class Solution { private long prev = Long.MIN_VALUE; public boolean isValidBST(TreeNode root) { if (root == null) { return true; } if (!isValidBST(root.left)) { return false; } if (root.val <= prev) { // 不满足二叉搜索树条件 return false; } prev = root.val; return isValidBST(root.right); } }
标签:return,val,随想录,代码,Day32,二叉,null,root,节点 From: https://www.cnblogs.com/dwj-ngu/p/16937213.html