驗證二叉搜尋樹
題目描述:給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。
假設一個二叉搜尋樹具有如下特徵:
- 節點的左子樹只包含小於當前節點的數。
- 節點的右子樹只包含大於當前節點的數。
- 所有左子樹和右子樹自身必須也是二叉搜尋樹。
示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:遞迴法
根據二叉搜尋樹的性質,當前節點左子樹的上邊界(不包含)和右子樹的下邊界(不包含)是當前節點的值,所以可以用遞迴的方法來解決,遞迴過程如下:
- 根節點沒有父結點,所以第一次呼叫遞迴方法上下邊界使用最大最小值;
- 如果當前節點為null,說明是葉子節點,直接返回true;
- 如果當前節點的值不在上下邊界範圍內,返回false;
- 遞迴判斷當前節點的左右節點是否在相應的上線邊界範圍內。
import com.kaesar.leetcode.TreeNode;
public class LeetCode_098 {
/**
* 遞迴法
*
* @param root
* @return
*/
public static boolean isValidBST(TreeNode root) {
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
/**
* 遞迴方法
*
* @param node 當前節點
* @param low 當前節點的下邊界(不包含)
* @param high 當前節點的上邊界(不包含)
* @return
*/
private static boolean isValidBST(TreeNode node, long low, long high) {
// 如果node為null,說明是葉子節點,直接返回true
if (node == null) {
return true;
}
// 如果當前節點的值不在上下邊界範圍內,返回false
if (node.val <= low || node.val >= high) {
return false;
}
// 遞迴判斷當前節點的左右節點是否在相應的上線邊界範圍內
return isValidBST(node.left, low, node.val) && isValidBST(node.right, node.val, high);
}
public static void main(String[] args) {
TreeNode root = new TreeNode(5);
root.left = new TreeNode(1);
root.right = new TreeNode(4);
root.right.left = new TreeNode(3);
root.right.right = new TreeNode(6);
System.out.println(isValidBST(root));
}
}
【每日寄語】 生命不是用來尋找答案,不是用來解決問題,它是用來愉快地生活的。與其愁眉苦臉地去工作,不如寄工作於娛樂。努力的人萬歲!