98.验证二叉搜索树
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
前序遍历设置区间的思路or中序遍历中,利用!isValidBST(root.left) || root.val <= pre
的判断条件,让每递归一次就能进行一次判断的思路
Solution:前序遍历
先遍历父节点,再遍历子节点,在遍历父节点的时候,我们需要判断其是否在一个范围里面,这个范围[lower,upper]
,需要不断通过当前遍历的val
进行缩小,左子树的范围是[lower,val]
,而右子树的范围是[val,upper]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution { public boolean isValidBST(TreeNode root) { return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE); }
public boolean isValidBST(TreeNode node, long lower, long upper) { if (node == null) { return true; } if (node.val <= lower || node.val >= upper) { return false; } if (!isValidBST(node.left, lower, node.val)) { return false; } return isValidBST(node.right, node.val, upper); } }
|
Solution:中序遍历
BST
的中序遍历结果一定是递增序列,实际上我们只需要用一个变量记录节点的前一个值,比较大小即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { private long pre = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) { if (root == null) return true;
if (!isValidBST(root.left) || root.val <= pre) return false;
pre = root.val;
return isValidBST(root.right); } }
|