98:驗證二叉搜尋樹
問題給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。
假設乙個二叉搜尋樹具有如下特徵:
1.節點的左子樹只包含小於當前節點的數。
2.節點的右子樹只包含大於當前節點的數。
3.所有左子樹和右子樹自身必須也是二叉搜尋樹。
示例 1:
輸入:
2/ \
1 3
輸出: true
示例2:
輸入:
5/ \
1 4
/ \3 6
輸出: false
解釋: 輸入為: [5,1,4,null,null,3,6]。
根節點的值為 5 ,但是其右子節點值為 4 。
題解:
方法一:遞迴
思路與演算法
要解決這道題首先我們要了解二叉搜尋樹有什麼性質可以給我們利用,由題目給出的資訊我們可以知道:如果該二叉樹的左子樹不為空,則左子樹上所有節點的值均小於它的根節點的值; 若它的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;它的左右子樹也為二叉搜尋樹。
這啟示我們設計乙個遞迴函式 helper(root, lower, upper) 來遞迴判斷,函式表示考慮以 root 為根的子樹,判斷子樹中所有節點的值是否都在 (l,r)(l,r) 的範圍內(注意是開區間)。如果 root 節點的值 val 不在 (l,r)(l,r) 的範圍內說明不滿足條件直接返回,否則我們要繼續遞迴呼叫檢查它的左右子樹是否滿足,如果都滿足才說明這是一棵二叉搜尋樹。
那麼根據二叉搜尋樹的性質,在遞迴呼叫左子樹時,我們需要把上界 upper 改為 root.val,即呼叫 helper(root.left, lower, root.val),因為左子樹里所有節點的值均小於它的根節點的值。同理遞迴呼叫右子樹時,我們需要把下界 lower 改為 root.val,即呼叫 helper(root.right, root.val, upper)。
函式遞迴呼叫的入口為 helper(root, -inf, +inf), inf 表示乙個無窮大的值。
完整**實現
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
bool
isvalidbst
(treenode* root)
};
複雜度分析
時間複雜度 : o(n),其中 n為二叉樹的節點個數。在遞迴呼叫的時候二叉樹的每個節點最多被訪問一次,因此時間複雜度為 o(n)。
空間複雜度 : o(n),其中 n 為二叉樹的節點個數。遞迴函式在遞迴過程中需要為每一層遞迴函式分配棧空間,所以這裡需要額外的空間且該空間取決於遞迴的深度,即二叉樹的高度。最壞情況下二叉樹為一條鏈,樹的高度為 n ,遞迴最深達到 n 層,故最壞情況下空間複雜度為 o(n) 。
力扣每日一題 6 14
1300 轉變陣列後最接近目標值的陣列和 給你乙個整數陣列 arr 和乙個目標值 target 請你返回乙個整數 value 使得將陣列中所有大於 value 的值變成 value 後,陣列的和最接近 target 最接近表示兩者之差的絕對值最小 如果有多種使得和最接近 target 的方案,請你返...
每日一題力扣48
給定乙個 n n 的二維矩陣 matrix 表示乙個影象。請你將影象順時針旋轉 90 度。你必須在 原地 旋轉影象,這意味著你需要直接修改輸入的二維矩陣。請不要 使用另乙個矩陣來旋轉影象。正解 旋轉90度就是,先鏡面對稱,再轉置即可 class solution defrotate self,mat...
每日一題力扣498
給定乙個含有 m x n 個元素的矩陣 m 行,n 列 請以對角線遍歷的順序返回這個矩陣中的所有元素,對角線遍歷如下圖所示。正解 這道題太焦心了!class solution def finddiagonalorder self,matrix list list int list int ifnot...