1. 程式人生 > 實用技巧 >驗證二叉搜尋樹

驗證二叉搜尋樹

問題描述

給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。

假設一個二叉搜尋樹具有如下特徵:節點的左子樹只包含小於當前節點的數;節點的右子樹只包含大於當前節點的數;所有左子樹和右子樹自身必須也是二叉搜尋樹。

示例 1:

輸入:

2

/ \

1 3

輸出: true

示例 2:

輸入:

5

/ \

1 4

/ \

3 6

輸出: false

解釋: 輸入為: [5,1,4,null,null,3,6]。

根節點的值為 5 ,但是其右子節點值為 4 。

解法一(遞迴):

看到這題我的第一反應肯定是遞迴:

    public boolean isValidBST(TreeNode root) {
        
//定義三個節點中、左、右 return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } public boolean isValidBST(TreeNode root, long minVal, long maxVal) { if (root == null) return true; //不滿足條件直接false if (root.val >= maxVal || root.val <= minVal) return false
; //遞迴下一層 return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal); }

解法二(遞迴):

 //定義一個前驅節點
    TreeNode prev;
    //中序遍歷思想
    public boolean isValidBST2(TreeNode root) {
        if (root == null) 
            return true;
        //遍歷左子樹
if (!isValidBST2(root.left)) return false; if (prev != null && prev.val >= root.val) return false; prev = root; //遍歷右子樹 if (!isValidBST2(root.right)) return false; return true; }

解法三(迭代):

    public boolean isValidBST1(TreeNode root) {
        //迭代的中序遍歷
        if (root == null)return true;
        Stack<TreeNode> stack =new Stack<>();
        TreeNode pre = null;
        while (root != null||!stack.isEmpty()){
            while (root!=null){
                stack.add(root);
                root=root.left;
            }
            root=stack.pop();
            if (pre != null && prev.val >= root.val) return false;
            pre = root;
            root = root.right;
        }
        return true;
    }

總結:

這題掌握中序遍歷就很好做了,左子樹小於根節點,右子樹大於根節點。