題目描述:
給你一個二叉樹的根節點 ,判斷其是否是一個有效的二叉搜索樹。root 有效 二叉搜索樹定義如下: 節點的左子樹只包含 小于 當前節點的數。 節點的右子樹只包含 大于 當前節點的數。 所有左子樹和右子樹自身必須也是二叉搜索樹。
獲得更多?算法思路:代碼文檔,算法解析的私得。
一個有效的二叉搜索樹(BST)要求對于每個節點,其左子樹中的所有節點值都要小于當前節點值,而其右子樹中的所有節點值都要大于當前節點值。同時,還要確保每個子樹自身也是一個有效的二叉搜索樹。
基于這個思想,我們可以采用遞歸的方式來判斷一個二叉樹是否是有效的二叉搜索樹。對于每個節點,我們可以限定一個上下界,保證其左子樹的所有節點值都在這個上下界內,而右子樹的所有節點值都在另一個上下界內。
具體步驟如下:
- 初始化遞歸函數,傳入當前節點、左界限和右界限。
- 如果當前節點為空,直接返回 true。
- 如果當前節點值不在左界限和右界限范圍內,返回 false。
- 對左子樹遞歸調用,左界限不變,右界限變為當前節點值。
- 對右子樹遞歸調用,左界限變為當前節點值,右界限不變。
- 如果左子樹和右子樹都返回 true,則說明當前節點及其子樹是有效的二叉搜索樹。
這個過程遞歸地向下進行,最終判斷整棵樹是否是有效的二叉搜索樹。
運行效果
完整代碼
/*** 2 * @Author: LJJ* 3 * @Date: 2023/8/18 13:32* 4*/
public class ValidateBST {static class TreeNode{int val;TreeNode left;TreeNode right;TreeNode(int val){this.val = val;}}// 主函數,判斷給定二叉樹是否為有效二叉搜索樹public boolean isValidBST(TreeNode root){// 調用遞歸函數,初始值不限定上界和下界return isValidBST(root,null,null);}// 遞歸函數,判斷以當前節點為根的子樹是否為有效的二叉搜索樹private boolean isValidBST(TreeNode node, Integer lower, Integer upper){// 遞歸終止條件,如果當前節點為空,說明子樹是一個有效的二叉搜索樹if (node == null){return true;}int val = node.val;// 檢查當前結點的是否在合適的范圍內if (lower != null && val <= lower){return false;}if (upper != null && val >= upper){return false;}// 遞歸判斷左子樹和右子樹是否是有效的二叉搜索樹// 對于左子樹,當前節點的值成為上界;對于右子樹,當前節點的值成為下界return isValidBST(node.left,lower,val) && isValidBST(node.right,val,upper);}public static void main(String[] args) {ValidateBST validateBST = new ValidateBST();// 創建示例二叉樹TreeNode root = new TreeNode(5);root.left = new TreeNode(2);root.right = new TreeNode(7);root.left.left = new TreeNode(1);root.left.right = new TreeNode(3);root.right.left = new TreeNode(6);root.right.right = new TreeNode(8);// 調用驗證函數并輸出結果boolean isValid = validateBST.isValidBST(root);System.out.println("是否為二叉搜索樹? " + isValid); // 輸出 true}
}