LeetCode-98。バイナリ検索ツリーの検証-DFS

98.二分探索木を確認する

タイトル説明

二分木が与えられたら、それが有効な二分探索木であるかどうかを判断します。

二分探索木が次の特性を持っていると仮定します。

ノードの左側のサブツリーには、現在のノードよりも小さい番号のみが含まれています。
ノードの右側のサブツリーには、現在のノードより大きい番号のみが含まれています。
すべての左サブツリーと右サブツリー自体も二分探索木である必要があります。
例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;
    }


おすすめ

転載: blog.csdn.net/qq_35655602/article/details/115017122