採用遞迴的方式,判斷左節點小於根,右節點大於根。
結果:錯誤。
錯誤案例為:
原因:右孩子的左孩子(右孫子)可能小於父親。 6 < 10,出錯。
想到的解決方案:在遞迴過程中吧祖先記錄下來,用以後續的比較。
在遞迴過程中加入祖先,並且加入 bool 標識指示是左孩子還是右孩子。
public
class
solution1
public
boolean
isvalid
(treenode root, arraylist
parents,
boolean isright)
arraylist
clone =
(arraylist
)parents.
clone()
; clone.
add(root)
; left =
isvalid
(root.left, clone,
false);
right =
isvalid
(root.right, clone,
true);
return left && right;
}}
再次出錯,出錯案例為:
出錯原因:曾孫子,曾曾孫子都有可能出錯。上述為 根為 1 的左右標記覆蓋了根為 3 的左右標記,導致 最下面的 3 無法被判誤。
解決方法:標記去除,換為上下界,每次迭代按收窄趨勢更新上下界。因此有了想法 3。
public
class
solution1
public
boolean
isvalid
(treenode root,
int min,
int max)
}
**大大減少,並且能夠覆蓋上述的情況。
但出現了邊界問題,當節點的值為min
或者max
時,會直接判斷錯誤。
但是,存在一些min
,max
為正確的案例。
無法解決。。。
看答案。。。
查閱答案後發現,把邊界的型別改為long
即可
public
class
solution1
public
boolean
isvalid
(treenode root, long min, long max)
}
在答案中還看到了另外一種思路:原文
採用中序遍歷二叉樹,獲得的值按公升序,即表示為合格的 bst。
public
class
solution2
// 訪問左子樹if(
!isvalidbst
(root.left)
)// 訪問當前節點:如果當前節點小於等於中序遍歷的前乙個節點,說明不滿足bst,返回 false;否則繼續遍歷。
if(root.val <= pre)
pre = root.val;
// 訪問右子樹
return
isvalidbst
(root.right);}
}
與上述方法相同的思路,有以下的寫法:
public
class
solution3if(
isvalidbst
(root.left))}
return
false;}
}
推薦採用第一種,原因是:
對於乙個 bst 的否定,是分離的 false statement。但對於它的肯定,則需要串聯的 true statement。
因此進行否定的難度較小。
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 13輸出 true例項2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...
leetcode 98 驗證二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。乙個二叉搜尋樹具有如下特徵 示例 1 輸入 1 3 輸出 true 示例 2 輸入 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 關鍵資訊 1二叉搜尋樹的中序遍歷是遞...