題目
實現一個函數,檢查一棵二叉樹是否爲二叉搜索樹。
示例 1:
輸入:
2
/ \
1 3
輸出: true
示例 2:
輸入:
5
/ \
1 4
/ \
3 6
輸出: false
解釋: 輸入爲: [5,1,4,null,null,3,6]。
根節點的值爲 5 ,但是其右子節點值爲 4 。
實現思路
經典題目,考察二叉搜索樹的特點,中序遍歷結果集爲遞增序列,所以只需中序遍歷判斷結果集是否是遞增序列即可。
定義一個遍歷temp保存每次遍歷的節點val值,如果它每次都進行更新也就代表遍歷的是遞增序列,否則不是二叉搜索樹,可以定義個boolean變量作爲不是遞增序列的結束條件。
其中一個重要的點,定位的最小值應該用 Long.MIN_VALUE 具體解釋看代碼
代碼
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private boolean isbst = true;
// 解答失敗:
// 測試用例:[-2147483648]
// 測試結果:false
// 期望結果:true
//Integer的MIN_VALUE 爲-2147483648 不合適 所以替換爲long的MIN_VALUE
private long temp = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
solve(root);
return isbst;
}
public void solve(TreeNode root) {
if (root == null || !isbst) {
return;
}
solve(root.left);
if (root.val > temp) {
temp = root.val;
} else {
isbst = false;
}
solve(root.right);
}
}