這道題乍一看,覺得挺簡單,但是有乙個點比較容易忽略,例如下面這個用例
5
/ \1 4
/ \3 6
對於3這個節點,雖然滿足小於4,但是作為5的右子樹,其所有子節點都應該大於5,因此這棵樹不是二叉搜尋樹。
很自然想到採用遞迴的方式
通過記錄上下限的方式,保證子樹上所有節點滿足要求,遞迴至右子樹時,更新下限,遞迴至左子樹時更新上限。
最左節點和最右節點分別沒有下限和上限,可以使用乙個標記來表示,或者定義乙個魔術字,本例中採用定義乙個結構體的方式。
#define true 1
#define false 0
#define upper 1
#define lower (-1)
typedef
struct tag_limit
limit;
bool recursionjudge
(struct treenode *root, limit upper, limit lower )
if(upper.flag == upper && root->val >= upper.limit)
return false;
if(lower.flag == lower && root->val <= lower.limit)
return false;
upperleft.flag = upper;
upperleft.limit = root->val;
lowerritht.flag = lower;
lowerritht.limit = root->val;
bool relt =
recursionjudge
(root->left, upperleft, lower)
&&recursionjudge
(root->right, upper, lowerritht)
;return relt;
}bool isvalidbst
(struct treenode* root)
limit upper;
limit lower;
upper.flag =0;
upper.limit =0;
lower.flag =0;
lower.limit =0;
return
recursionjudge
(root, upper, lower)
;}
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 如果對二叉搜尋樹不夠了解,可能...