給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。
假設乙個二叉搜尋樹具有如下特徵:
節點的左子樹只包含小於當前節點的數。
節點的右子樹只包含大於當前節點的數。
所有左子樹和右子樹自身必須也是二叉搜尋樹。
輸入:
2/ \
1 3
輸出: true
輸入:
5/ \
1 4
/ \3 6
輸出: false
解釋: 輸入為: [5,1,4,null,null,3,6]。
根節點的值為 5 ,但是其右子節點值為 4 。
/**
* 0098-驗證二叉搜尋樹
* 給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。
* * 假設乙個二叉搜尋樹具有如下特徵:
* * 節點的左子樹只包含小於當前節點的數。
* 節點的右子樹只包含大於當前節點的數。
* 所有左子樹和右子樹自身必須也是二叉搜尋樹。
* * 示例 1:
* * 輸入:
* 2* / \
* 1 3
* 輸出: true
* * 示例 2:
* * 輸入:
* 5* / \
* 1 4
* / \
* 3 6
* 輸出: false
* 解釋: 輸入為: [5,1,4,null,null,3,6]。
* 根節點的值為 5 ,但是其右子節點值為 4 。
*//**
* definition for a binary tree node.
*/class
treenode
treenode
(int val)
treenode
(int val, treenode left, treenode right)
}/**
* 思路:
* 如果該二叉樹的左子樹不為空,則左子樹上所有節點的值均小於它根節點的值,若它的右子樹不為空,則右子樹
* 上的所有節點君大於它的根節點的值,它的左右子樹也為二叉搜尋樹。
* * 設計乙個遞迴函式 helper(root, lower, upper) 來遞迴判斷,函式表示考慮root為根的子樹,判斷
* 子樹中所有節點的值是否都在 (l,r)的範圍呢你(開區間)。如果root 節點的值val 不在範圍內說明不
* 滿足條件直接返回,否則繼續遞迴呼叫檢查它的左右子樹是否滿足,如果都滿足才說明是一棵二叉搜尋樹。
* * 根據二叉搜尋樹的性質,在遞迴呼叫左子樹時,我們需要把上界 upper 改為 root.val,
* 即呼叫 helper(root.left, lower, root.val),因為左子樹里所有節點的值均小於它的根節點的值。
* 同理遞迴呼叫右子樹時,我們需要把下界 lower 改為 root.val,
* 即呼叫 helper(root.right, root.val, upper)。
* * 函式遞迴呼叫的入口為 helper(root, -inf, +inf), inf 表示乙個無窮大的值。
*/class
solution
/** * 遞迴呼叫判斷
** @param root
* @param lower
* @param upper
* @return
*/private
boolean
helper
(treenode root, integer lower, integer upper)
int val = root.val;
if(lower != null && val <= lower)
if(upper != null && val >= upper)if(
!helper
(root.left, lower, val))if
(!helper
(root.right, val, upper)
)return
true;}
}/**
* 測試
leetcode 驗證二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 示例 1 輸入 2 1 3輸出 true 示例 2 輸入 5 1 4 3 6輸出 false解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 需要注意的是,左 右子樹 是指...
LeetCode 驗證二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 1 3 輸出 true 示例 2 輸入 5 1 4 3 6 輸出 false 解釋 ...
驗證二叉搜尋樹(leetcode)
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。1.遞迴 2020.5.5 9 09 definition for a binary tree node...