LeetCode 98 驗證二叉搜尋樹

2021-10-03 04:12:24 字數 1285 閱讀 4520

這道題乍一看,覺得挺簡單,但是有乙個點比較容易忽略,例如下面這個用例

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 如果對二叉搜尋樹不夠了解,可能...