原題(medium):
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。
假設乙個二叉搜尋樹具有如下特徵:
就是說結點的左子樹的所有結點都要小於當前結點,結點的右子樹的所有結點都要大於當前結點。
這就有點複雜了,於當前結點而言,它的存在是否合理,要看它的父節點,以及父節點再往上的結點,舉個例子:
於當前結點而言(值為val),決定其值是否合理的,第乙個要看其父節點,這裡有兩種情況,首先看x這個結點(數字僅為標記結點,並非其當前值),當前結點是其x這個結點的右子結點,那麼val必須大於x->val,這是它的下界(不能低於它),那麼val的上界呢,就是說它有沒有乙個不能高於的值,有,因為x這個點有父節點z,且x為該父節點的左子結點,說明x結點為根結點的子樹的所有結點的值必須小於z這個結點的值,所以val的上界就是z->val,你可能說這不一定啊,如果z還有父節點zz且z是它的左子結點呢?對,沒錯,那這樣的話val的上界就是結點zz值。如果當前結點是父節點的右子結點,需要保留其上界(即當前結點的上界來自父節點的上界),並設定其下界為父節點的值。
另外一種情況就是當前結點為y這個結點的左子結點,為了更好的說明情況,我們假設val合理,並且當前結點來到了j這個結點上,要想驗證j->val是否合理,首先其值不能大於val,即j->val < val,這就是 j->val的的上界,那下界呢?如果val有乙個父節點x,因為x的右子結點所形成的子樹上的所有結點的值都會大於x->val,那麼要想j->val合理,j->val > x->val就必須成立,那麼x->val就是它下界。如果當前結點是父節點的左子結點,需要保留其下界(即當前結點的下界來自父節點的下界),並設定其上界為父節點的值。
根結點是乙個沒有上下界的點,那麼要從根結點開始,就要設定其上下界為型別最小值和型別最大值。
我們可以通過遞迴遍歷各結點,並在即將進入某個結點時,設定好其上下界(根據上述來決定其上下界的值)。
1/**至於為什麼上下界是long型別,是因為該題中有幾個超出整型範圍的cases,不得不改為long型。2* definition for a binary tree node.
3* struct treenode
8* };9*/
1011
bool recursion(treenode* root, long lower, long
upper)
1228
29bool isvalidbst(treenode*root)
這個思路就顯淺易懂了,我們應該都知道,乙個二叉排序樹的中序遍歷能夠獲得其依次遞增的陣列,應為左子樹 -> 結點 -> 右子樹
意味著對於二叉搜尋樹而言,每個元素都應該比下乙個元素小。所以,只要我們中序遍歷該樹,並對得到的陣列逐一比較大小,看是否是依次遞增就好了。用的是遞迴。
leetcode 98 驗證二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。乙個二叉搜尋樹具有如下特徵 示例 1 輸入 1 3 輸出 true 示例 2 輸入 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 關鍵資訊 1二叉搜尋樹的中序遍歷是遞...
leetcode 98 驗證二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。乙個二叉搜尋樹具有如下特徵 示例 1 輸入 2 1 3 輸出 true示例 2 輸入 5 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 解題思路 中序遍歷遞增,每次只...
leetcode 98 驗證二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。乙個二叉搜尋樹具有如下特徵 示例 1 輸入 2 1 3 輸出 true示例 2 輸入 5 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 如果對二叉搜尋樹不夠了解,可能...