1. 程式人生 > >【LeetCode】 98 驗證二叉搜尋樹

【LeetCode】 98 驗證二叉搜尋樹

在這裡插入圖片描述


解題思路:
1 二叉搜尋樹和中序遍歷有著密不可分的關係,中序遍歷的結果是所有樹中的節點從左到右的排列。如上圖示例2中的樹 中序遍歷結果應是15346
2 基於1,我們易知,如果中序遍歷的結果是升序排列的,那麼此樹符合二叉搜尋樹的要求,所以可以用中序遍歷並檢測檢測結果的升序情況來做。
3 更快速的演算法是:通過定義來做,對每個節點設定一個最大值和最小值,判斷完了之後將左右子樹分別遞迴呼叫此方法。

程式碼(中序遍歷):

class Solution {
    public boolean isValidBST(TreeNode root) {
        // List<Integer> vals = new ArrayList<>();
        Stack<TreeNode> treeNodes = new Stack<>();
        
        TreeNode nowNode = root;
        int pre = Integer.MIN_VALUE;
        boolean flag = true;
        
        do{
            while (nowNode != null){
                treeNodes.push(nowNode);
                nowNode = nowNode.left;
            }
            
            if (!treeNodes.empty()){
                nowNode = treeNodes.pop();
                if (flag){
                    flag = false;
                }
                else if (nowNode.val <= pre)
                    return false;
                pre = nowNode.val;
                nowNode = nowNode.right;
            }
        }while (nowNode != null || !treeNodes.empty());
        
        return true;
        
    }
}

程式碼(定義+遞迴):

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isValidBST(TreeNode root) {
        if (root == null) return true;
        return valid(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }
    
    public boolean valid(TreeNode root, long low, long high) {
        if (root == null) return true;
        if (root.val <= low || root.val >= high) return false;
        return valid(root.left, low, root.val) && valid(root.right, root.val, high);
    }
}