タイトル説明
二分木が与えられたら、それが有効な二分探索木であるかどうかを判断します。
二分探索木が次の特性を持っていると仮定します。
ノードの左側のサブツリーには、現在のノードよりも小さい番号のみが含まれています。
ノードの右側のサブツリーには、現在のノードより大きい番号のみが含まれています。
すべての左サブツリーと右サブツリー自体も二分探索木である必要があります。
例1:
入る:
2
/ \
1 3
出力:true
例2:
入る:
5
/ \
1 4
/ \
3 6
出力:false
説明:入力は[5,1,4、null、null、3,6]です。
ルートノードの値は5ですが、その右側の子ノードの値は4です。
問題解決のアイデア
//用一个变量记录前一个节点
long pre = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if (root == null){
return true;
}
//访问左子树
if (!isValidBST(root.left)){
return false;
}
//访问当前节点,如果当前节点小于等于中序遍历的前一个节点,说明不满足BST,返回false;否则继续遍历
if (root.val <= pre){
return false;
}
pre = root.val;
//访问右子树
return isValidBST(root.right);
}
public boolean isValidBST(TreeNode root){
return recurse(root,null,null);
}
public boolean recurse(TreeNode node,Integer lower,Integer upper){
//空节点是合理的二叉搜索树
if (node == null){
return true;
}
//节点不为空,判断节点上的值是否在上下界内
int val = node.val;
if (lower != null && val <= lower)return false;
if (upper != null && val >= upper)return false;
//将当前节点的值替换为下届,继续检查右边的子节点
if (!recurse(node.right,val,upper))return false;
//将当前节点的值替换为上界,继续检查左边的子节点
if (!recurse(node.left,lower,val))return false;
return true;
}