【兩次過】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), =