leetCode 98.Validate Binary Search Tree (有效二叉搜索樹) 解題思路和方法

Given a binary tree, determine if it is a valid binary search tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.


思路:判斷是否二叉搜索樹,按照定義判斷即可,比較簡單。

代碼如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isValidBST(TreeNode root) {
        if(root == null){
            return true;
        }
        //判斷左子樹的值是否全比根小,右子樹是否全比根大,不是則返回false
        if(!isLessThan(root, root.left) || !isGreaterThan(root, root.right)){
        	return false;
        }

        //如果左右子樹均爲空,爲真
        boolean temp = true;
        //判斷左子樹
        if(root.left != null){
        	if(root.val > root.left.val){
        		temp = isValidBST(root.left);
        	}else{
        		temp = false;
        	}
        }
        //如果左子樹成立,判斷右右子樹
        if(temp && root.right != null){
        	if(root.right.val > root.val){
        		temp = isValidBST(root.right);
        	}else{
        		temp = false;
        	}
        }
        return temp;
    }
    /**
     * 判斷左子樹是否全比根節點小
     * @param root
     * @param left
     * @return
     */
    private boolean isLessThan(TreeNode root, TreeNode left){
    	if(left == null){
    		return true;
    	}
    	boolean temp = false;
    	if(left.val < root.val){
    		temp = isLessThan(root, left.left) && isLessThan(root, left.right);
    	}
    	return temp;
    }
	
    /**
     * 判斷右子樹全比根節點大
     * @param root
     * @param right
     * @return
     */
    private boolean isGreaterThan(TreeNode root, TreeNode right){
    	if(right == null){
    		return true;
    	}
    	boolean temp = false;
    	if(right.val > root.val){
    		temp = isGreaterThan(root, right.left) && isGreaterThan(root, right.right);
    	}
    	return temp;
    }
}

另一種比較簡潔的代碼方式:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isValidBST(TreeNode root) {
        if(root == null){
            return true;
        }
        //用long是因爲要考慮Integer.MIn和Max的衝突
        return check(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }
    /**
     * 判斷根節點的是否在左右屆中間
     * 是則繼續遞歸判斷左右,不是則返回false
     */
    private boolean check(TreeNode root, long l, long r){
    	if(root == null)
    		return true;
    	return root.val > l && root.val < r && 
    			check(root.left,l,root.val) && check(root.right, root.val, r);
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章