给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/validate-binary-search-tree
解题思路
这个方法是递归方式的中序遍历的变式
因为二叉搜索树的中序遍历一定是从小到大的
所以如果中序遍历中发现有一个元素前面的元素比它大
说明该树不是二叉搜索树
原始的中序遍历
private void inorder(TreeNode root) {
if (root == null) {
return;
}
// 左根右的顺序遍历
inorder(root.left);
System.out.println("遍历根节点");
inorder(root.right);
}
现在只需要在遍历根节点的地方做修改
我们使用一个辅助变量记录"前序遍历中的上一个节点" TreeNode temp = null
特殊情况是第一个节点被遍历到时temp
为null
此时只需要temp = 当前节点
记录起来而不判断
除第一个节点之外,其他节点要与temp
比较,如果temp
的值大于等于自己的值则直接将result
值为false
并返回,否则将temp
置为本次遍历的节点以更新当前被遍历的节点
代码
class Solution {
TreeNode temp = null;
boolean result = true;
public boolean isValidBST(TreeNode root) {
check(root);
return result;
}
/**
* 这个方法是递归方式的中序遍历的变式
* 因为二叉搜索树的中序遍历一定是从小到大的
* 所以如果中序遍历中发现有一个元素前面的元素比它大
* 说明该树不是二叉搜索树
*
* @param root 递归的节点
* @return void
*/
private void check(TreeNode root) {
if (root == null) {
return;
}
check(root.left);
if (temp == null) {
temp = root;
} else {
if (temp.val >= root.val) {
result = false;
return;
} else {
temp = root;
}
}
check(root.right);
}
}