·题目描述
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左
子树
只包含 小于 当前节点的数。 - 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3] 输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。
·解题思路
就是不能判断该节点和自己的左右子结点的大小,要判断左右子树的全部结点,因此需要引入两个指针min 和 max 来维护判断。
- 在这个调用中,
val
是当前节点的值,被传递给右子树作为新的下界lower
。- 这意味着右子树中所有节点的值必须大于
val
。
- 这意味着右子树中所有节点的值必须大于
upper
是右子树的上界,保持不变,因为右子树的所有节点还必须小于这个上界。
·Java代码
class Solution {
public boolean isSymmetric(TreeNode root) {
return dfs(root , null , null);
}
public boolean dfs(TreeNode node , Integer min , Integer max){
if(node == null ) return true;
int val = node. val ;
if(min != null && val <= min) return false;
if(max != null && val >= max) return false;
if(!dfs(node.left , min , val)) return false;
if(!dfs(node.right , val , max)) return false;
return true;
}
public class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x){val = x;}
TreeNode(int val, TreeNode left, TreeNode right){
this.val = val;
this.left = left;
this.right = right;
}
}
}