[leetcode]驗證二叉搜尋樹
阿新 • • 發佈:2018-12-24
///////////////////////////////////////////////////////////////////////////////////////////
給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。
假設一個二叉搜尋樹具有如下特徵:
- 節點的左子樹只包含小於當前節點的數。
- 節點的右子樹只包含大於當前節點的數。
- 所有左子樹和右子樹自身必須也是二叉搜尋樹。
示例 1:
輸入: 2 / \ 1 3 輸出: true
示例 2:
輸入: 5 / \ 1 4 / \ 3 6 輸出: false 解釋: 輸入為: [5,1,4,null,null,3,6]。 根節點的值為 5 ,但是其右子節點值為 4 。
///////////////////////////////////////////////////////////////////////////////////////////
需要注意的是,“左/右子樹”是指左/右分支下所有的子節點,而不是隻有最近的兩個。我開始就理解錯了。
提供一個很簡單的思路,從根節點開始,驗證左子樹是不是滿足“只包含小於當前節點的數”,驗證右子樹是不是滿足“只包含大於當前節點的數”,然後遞迴驗證每一個節點。
驗證左/右子樹是不是滿足條件,只要遍歷一遍即可,也是使用了遞迴。
class Solution { public: bool isSmaller(int x, TreeNode *node) { if (node == NULL) return true; if (node->val >= x) return false; if (isSmaller(x, node->left) && isSmaller(x, node->right)) return true; return false; } bool isBigger(int x, TreeNode *node) { if (node == NULL) return true; if (node->val <= x) return false; if (isBigger(x, node->left) && isBigger(x, node->right)) return true; return false; } bool isValidBST(TreeNode* root) { if (root == NULL) return true; if (!(isBigger(root->val, root->right) && isSmaller(root->val, root->left))) return false; if (isValidBST(root->left) && isValidBST(root->right)) return true; return false; } };
也順便貼上開始理解錯誤的程式碼。本來寫完還覺得自己很帥,其實不存在的。
//錯誤的解法 class Solution { public: bool isValidBST(TreeNode* root) { if (root == NULL) return true; if (root->left != NULL && root->left->val >= root->val) return false; if (root->right != NULL && root->right->val <= root->val) return false; if (isValidBST(root->left) && isValidBST(root->right)) return true; return false; } };