1. 程式人生 > >【兩次過】Lintcode 95. 驗證二叉查詢樹

【兩次過】Lintcode 95. 驗證二叉查詢樹

給定一個二叉樹,判斷它是否是合法的二叉查詢樹(BST)

一棵BST定義為:

  • 節點的左子樹中的值要嚴格小於該節點的值。
  • 節點的右子樹中的值要嚴格大於該節點的值。
  • 左右子樹也必須是二叉查詢樹。
  • 一個節點的樹也是二叉查詢樹。

樣例

一個例子:

  2
 / \
1   4
   / \
  3   5

上述這棵二叉樹序列化為 {2,1,4,#,#,3,5}.

解題思路1:

二叉查詢樹有一個重要的性質:即中序遍歷遞增(不存在兩個節點值相等),根據此,中序遍歷完成後,檢視序列是否有序即可知道是否是二叉查詢樹。

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param root: The root of binary tree.
     * @return: True if the binary tree is BST, or false
     */
    bool isValidBST(TreeNode * root) 
    {
        // write your code here
        if(root == NULL)
            return true;
        
        vector<int> vec;   
        Inorder(root , vec);
        
        for(int i = 0;i < vec.size()-1;i++)
            if(vec[i] >= vec[i+1])
                return false;
        
        return true;
    }
    
private:
    void Inorder(TreeNode * root , vector<int> & vec)
    {
        if(root == NULL)
            return;
        
        Inorder(root->left , vec);
        vec.push_back(root->val);
        Inorder(root->right , vec);
    }
};

JAVA程式碼:

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */

public class Solution {
    /**
     * @param root: The root of binary tree.
     * @return: True if the binary tree is BST, or false
     */
    public boolean isValidBST(TreeNode root) {
        // write your code here
        List<Integer> list = new ArrayList<>();
        
        isValidBST(root, list);
        
        return isOrder(list);
    }
    
    private void isValidBST(TreeNode root, List<Integer> list){
        if(root == null)
            return;
            
        isValidBST(root.left, list);
        list.add(root.val);
        isValidBST(root.right, list);
    }
    
    private boolean isOrder(List<Integer> list){
        for(int i=1 ; i<list.size() ; i++)
            if(list.get(i) <= list.get(i-1))
                return false;
        
        return true;
    }
}

JAVA程式碼2:非遞迴方法,類似非遞迴的中序遍歷

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */

public class Solution {
    /**
     * @param root: The root of binary tree.
     * @return: True if the binary tree is BST, or false
     */
    public boolean isValidBST(TreeNode root) {
        // write your code here
        Stack<TreeNode> stack = new Stack<>();
        TreeNode pre = null;
        
        while(root!=null || !stack.isEmpty()){
            while(root != null){
                stack.push(root);
                root = root.left;
            }
            
            root = stack.pop();
            
            if(pre!=null && pre.val>=root.val)
                return false;
            pre = root;
            
            root = root.right;
        }
        
        return true;
    }
    
}

相關推薦

Lintcode 95. 驗證查詢

給定一個二叉樹,判斷它是否是合法的二叉查詢樹(BST) 一棵BST定義為: 節點的左子樹中的值要嚴格小於該節點的值。 節點的右子樹中的值要嚴格大於該節點的值。 左右子樹也必須是二叉查詢樹。 一個節點的樹也是二叉查詢樹。 樣例 一個例子: 2 / \ 1

Lintcode 453. 將拆成連結串列

將一棵二叉樹按照前序遍歷拆解成為一個假連結串列。所謂的假連結串列是說,用二叉樹的 right指標,來表示連結串列中的 next 指標。 樣例 1 \ 1 2 / \

lintcode(95)驗證查詢

描述: 給定一個二叉樹,判斷它是否是合法的二叉查詢樹(BST) 一棵BST定義為: 節點的左子樹中的值要嚴格小於該節點的值。節點的右子樹中的值要嚴格大於該節點的值。左右子樹也必須是二叉查詢樹。一個節點的樹也是二叉查詢樹。樣例: 一個例子: 2 / \ 1

[LintCode]95.驗證查詢排序搜尋) 中序遍歷

給定一個二叉樹,判斷它是否是合法的二叉查詢樹(BST) 一棵BST定義為: 節點的左子樹中的值要嚴格小於該節點的值。節點的右子樹中的值要嚴格大於該節點的值。左右子樹也必須是二叉查詢樹。一個節點的樹

Lintcode 1188. BST的最小絕對差

給定具有非負值的二叉搜尋樹,找到任意兩個節點的值之間的最小絕對差值. 樣例 輸入 1 \ 3 / 2 輸出: 1 說明: 最小絕對差值為1,即2和1(或2和3之間)之差。 注意事項 此BST中至少有兩個節點。 解題思路1:

Lintcode 1126. 合併

給出兩個二叉樹,並想象當你把其中一個覆蓋另一個時,兩棵樹的一些節點重疊,而其他節點則不重疊。 您需要將它們合併到一個新的二叉樹中。 合併規則是,如果兩個節點重疊,則將節點值加起來作為合併節點的新值。 否則,非空節點將用作新樹的節點。 樣例 輸入: 樹 1

Lintcode 1300. Nim Game

You are playing the following Nim Game with your friend: There is a heap of stones on the table, each time one of you take turns to remove 1 to 3 st

Lintcode 904. 加一連結串列

給定一個非負整數,這個整數表示為一個非空的單鏈表,每個節點表示這個整數的一位。返回這個整數加一。 除了0本身,所有數字在最高位前都沒有0。 列表的頭節點存的是這個整數的最高位。 樣例 給出連結串列1 -> 2 -> 3 -> null,返回 1 -&g

Lintcode 1078. 陣列的度

給定由非負整陣列成的非空陣列,陣列的度定義為出現頻率最高的元素。 找出最短的連續子陣列,並使得它和原陣列有相同的度。返回該連續子陣列的長度。 樣例 輸入: [1, 2, 2, 3, 1] 輸出:

Lintcode 1178. Student Attendance Record I

You are given a string representing an attendance record for a student. The record only contains the following three characters: 'A' : Ab

Lintcode 1350. Excel表列標題

給定一個正整數,返回相應的列標題,如Excel表中所示。 樣例 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> A

Lintcode 136. 分割回文串

給定一個字串s,將s分割成一些子串,使每個子串都是迴文串。 返回s所有可能的迴文串分割方案。 樣例 給出 s = "aab",返回 [ ["aa", "b"], ["a", "a", "

Lintcode 15. 全排列

給定一個數字列表,返回其所有可能的排列。 樣例 給出一個列表[1,2,3],其全排列為: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,

Lintcode 460. 在排序陣列中找最接近的K個數

給一個目標數 target, 一個非負整數 k, 一個按照升序排列的陣列 A。在A中找與target最接近的k個整數。返回這k個數並按照與target的接近程度從小到大排序,如果接近程度相當,那麼小的數排在前面。 樣例 如果 A = [1, 2, 3], target

Lintcode 63. 搜尋旋轉排序陣列 II

跟進“搜尋旋轉排序陣列”,假如有重複元素又將如何? 是否會影響執行時間複雜度? 如何影響? 為何會影響? 寫出一個函式判斷給定的目標值是否出現在陣列中。 樣例 給出[3,4,4,5,7,0,1,2]和target=4,返回 true 解題思路: 只需要舉出能夠

Lintcode 62. 搜尋旋轉排序陣列

假設有一個排序的按未知的旋轉軸旋轉的陣列(比如,0 1 2 4 5 6 7 可能成為4 5 6 7 0 1 2)。給定一個目標值進行搜尋,如果在陣列中找到目標值返回陣列中的索引位置,否則返回-1。 你可以假設陣列中不存在重複的元素。 樣例 給出[4, 5, 1, 2, 3]

Lintcode 585. 山脈序列中的最大值

給 n 個整數的山脈陣列,即先增後減的序列,找到山頂(最大值) 樣例 給出陣列為 [1, 2, 4, 8, 6, 3],返回 8 給出陣列為 [10, 9, 8, 7],返回 10 解題思路: 與Lintcode 7

Lintcode 75. 尋找峰值

你給出一個整數陣列(size為n),其具有以下特點: 相鄰位置的數字是不同的 A[0] < A[1] 並且 A[n - 2] > A[n - 1] 假定P是峰值的位置則滿足A[P] > A[P-1]且A[P] > A[P+1],返回陣列中任意一個峰

Lintcode 88. Lowest Common Ancestor of a Binary Tree

給定一棵二叉樹,找到兩個節點的最近公共父節點(LCA)。 最近公共祖先是兩個節點的公共的祖先節點且具有最大深度。 樣例 對於下面這棵二叉樹 4 / \ 3 7 / \ 5 6 LCA(3, 5) = 4 LCA(5, 6) = 

Lintcode 156. 合併區間

給出若干閉合區間,合併所有重疊的部分。 樣例 Given intervals => merged intervals: [ [ (1, 3), (1, 6), (2, 6), =