1. 程式人生 > 實用技巧 >二叉樹--驗證BST(leetcode 98)

二叉樹--驗證BST(leetcode 98)

知識點

BST的整個左子樹中所有元素的值都是要小於根的值

BST的整個右子樹中所有元素的值都是要大於根的值


遞迴解法


根據知識點,不能簡單的判斷是否左子小於根,右子大於根。

所以在遍歷樹的同時保留結點的上界和下界,在比較時不僅要比較結點的值,也要與上下界比較。


中序遍歷解法

二叉搜尋樹「中序遍歷」得到的值構成的序列一定是升序的,這啟示我們在中序遍歷的時候實時檢查當前節點的值是否大於前一箇中序遍歷到的節點的值即可。如果均大於說明這個序列是升序的,整棵樹是二叉搜尋樹,否則不是

    public boolean isValidBST(TreeNode root) {
        double pre = - Double.MAX_VALUE;
        Deque<TreeNode> stack = new ArrayDeque<TreeNode> ();
        TreeNode temp = root;
        while (!stack.isEmpty() || temp != null){
            if (temp != null){
                stack.push(temp);
                temp = temp.left;
            }else {
                temp = stack.pop();
                if (temp.val <= pre){
                    return false;
                }
                pre = temp.val;
                temp = temp.right;
            }
        }
        return true;
    }

時空間複雜度都是O(n)