1. 程式人生 > 其它 >98.驗證二叉搜尋樹

98.驗證二叉搜尋樹

技術標籤:# 樹專題二叉樹leetcodejava

98. 驗證二叉搜尋樹

給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。

假設一個二叉搜尋樹具有如下特徵:

  • 節點的左子樹只包含小於當前節點的數。
  • 節點的右子樹只包含大於當前節點的數。
  • 所有左子樹和右子樹自身必須也是二叉搜尋樹。

示例 1:

輸入:
    2
   / \
  1   3
輸出: true

示例 2:

輸入:
    5
   / \
  1   4
     / \
    3   6
輸出: false
解釋: 輸入為: [5,1,4,null,null,3,6]。
     根節點的值為 5 ,但是其右子節點值為 4 。

思路:

乍一看,這是一個平凡的問題。只需要遍歷整棵樹,檢查node.right.val > node.valnode.left.val < node.val對每個結點是否成立即可,但這種方法並不總是正確。如下圖這種情況不僅右子結點8要大於根節點5,整個右子樹的所有結點都應該大於根節點5,而下圖4是小於5的,故不是二叉搜尋樹。這意味著我們需要在遍歷樹的同時保留結點的上界與下界,判斷該結點的值是否在範圍內。

 	5
   / \
  1   8
     / \
    4   9

Java程式碼

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution { public boolean dfs(TreeNode root,long min,long max){ if(root == null) return true; if(root.val < min || root.val > max)return false; //由於root.val的值可以一開始就是int的邊界,故-1和+1可能會越界,因此轉成long型 return dfs(root.left,min,root.val - 1L) && dfs(root.right,
root.val + 1L,max); } public boolean isValidBST(TreeNode root) { //最初根節點的值在int範圍內即可 return dfs(root, Integer.MIN_VALUE,Integer.MAX_VALUE); } }