給定一個二叉樹,判斷其是否是一個有效的二叉搜索樹。
假設一個二叉搜索樹具有如下特征:
節點的左子樹只包含小于當前節點的數。
節點的右子樹只包含大于當前節點的數。
所有左子樹和右子樹自身必須也是二叉搜索樹。
示例 1:
輸入:
2
/ \
1 3
輸出: true
示例 2:
輸入:
5
/ \
1 4
/ \
3 6
輸出: false
解釋: 輸入為: [5,1,4,null,null,3,6]。
根節點的值為 5 ,但是其右子節點值為 4 。
(自己的做法,有誤):
思路:想用遞歸方法每次比較左中右的節點值,但這樣忽略的如以下情況:
10
/ \
5 15
/ \
6 20
每個小樹都符合左中右的大小,但如圖的6卻比root節點的10小。
解法:
思路:初始化時使用系統最大值和最小值,在遞歸過程中換成樹的節點值,用long代替int就是為了包括int的邊界條件這種情況。(算法參考這里)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
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;
if (root.val >= maxVal || root.val <= minVal) return false;
return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal);
}
}
解法2:
leetcode 高分解法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private TreeNode prev;
public boolean isValidBST(TreeNode root) {
return trave(root);
}
public boolean trave(TreeNode treeNode) {
if (treeNode != null) {
if (!trave(treeNode.left)) {
return false;
}
if (prev != null && treeNode.val <= prev.val) {
return false;
}
prev = treeNode;
if (!trave(treeNode.right)) {
return false;
}
}
return true;
}
}