<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Validate Binary Search Tree ### Source - lintcode: [(95) Validate Binary Search Tree](http://www.lintcode.com/en/problem/validate-binary-search-tree/) ~~~ Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as follows: The left subtree of a node contains only nodes with keys less than the node's key. The right subtree of a node contains only nodes with keys greater than the node's key. Both the left and right subtrees must also be binary search trees. Example An example: 1 / \ 2 3 / 4 \ 5 The above binary tree is serialized as "{1,2,3,#,#,4,#,#,5}". ~~~ ### 題解1 - recursion 按照題中對二叉搜索樹所給的定義遞歸判斷,我們從遞歸的兩個步驟出發分析: 1. 基本條件/終止條件 - 返回值需斟酌。 1. 遞歸步/條件遞歸 - 能使原始問題收斂。 終止條件好確定——當前節點為空,或者不符合二叉搜索樹的定義,返回值分別是什么呢?先別急,分析下遞歸步試試先。遞歸步的核心步驟為比較當前節點的`key`和左右子節點的`key`大小,和定義不符則返回`false`, 否則遞歸處理。從這里可以看出在節點為空時應返回`true`, 由上層的其他條件判斷。但需要注意的是這里不僅要考慮根節點與當前的左右子節點,**還需要考慮左子樹中父節點的最小值和右子樹中父節點的最大值。**否則程序在`[10,5,15,#,#,6,20]` 這種 case 誤判。 由于不僅需要考慮當前父節點,還需要考慮父節點的父節點... 故遞歸時需要引入上界和下界值。畫圖分析可知對于左子樹我們需要比較父節點中最小值,對于右子樹則是父節點中的最大值。又由于滿足二叉搜索樹的定義時,左子結點的值一定小于根節點,右子節點的值一定大于根節點,故無需比較所有父節點的值,使用遞推即可得上界與下界,這里的實現非常巧妙。 ### C++ - long long ~~~ /** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { public: /** * @param root: The root of binary tree. * @return: True if the binary tree is BST, or false */ bool isValidBST(TreeNode *root) { if (root == NULL) return true; return helper(root, LLONG_MIN, LLONG_MAX); } bool helper(TreeNode *root, long long lower, long long upper) { if (root == NULL) return true; if (root->val <= lower || root->val >= upper) return false; bool isLeftValidBST = helper(root->left, lower, root->val); bool isRightValidBST = helper(root->right, root->val, upper); return isLeftValidBST && isRightValidBST; } }; ~~~ ### C++ - without long long ~~~ /** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { public: /** * @param root: The root of binary tree. * @return: True if the binary tree is BST, or false */ bool isValidBST(TreeNode *root) { if (root == NULL) return true; return helper(root, INT_MIN, INT_MAX); } bool helper(TreeNode *root, int lower, int upper) { if (root == NULL) return true; if (root->val <= lower || root->val >= upper) { bool right_max = root->val == INT_MAX && root->right == NULL; bool left_min = root->val == INT_MIN && root->left == NULL; if (!(right_max || left_min)) { return false; } } bool isLeftValidBST = helper(root->left, lower, root->val); bool isRightValidBST = helper(root->right, root->val, upper); return isLeftValidBST && isRightValidBST; } }; ~~~ ### Java ~~~ /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */ public class Solution { /** * @param root: The root of binary tree. * @return: True if the binary tree is BST, or false */ public boolean isValidBST(TreeNode root) { if (root == null) return true; return helper(root, Long.MIN_VALUE, Long.MAX_VALUE); } private boolean helper(TreeNode root, long lower, long upper) { if (root == null) return true; // System.out.println("root.val = " + root.val + ", lower = " + lower + ", upper = " + upper); // left node value < root node value < right node value if (root.val >= upper || root.val <= lower) return false; boolean isLeftValidBST = helper(root.left, lower, root.val); boolean isRightValidBST = helper(root.right, root.val, upper); return isLeftValidBST && isRightValidBST; } } ~~~ ### 源碼分析 為避免節點中出現整型的最大最小值,引入 long 型進行比較。有些 BST 的定義允許左子結點的值與根節點相同,此時需要更改比較條件為`root.val > upper`. C++ 中 long 可能與 int 范圍相同,故使用 long long. 如果不使用比 int 型更大的類型,那么就需要在相等時多加一些判斷。 ### 復雜度分析 遞歸遍歷所有節點,時間復雜度為 O(n)O(n)O(n), 使用了部分額外空間,空間復雜度為 O(1)O(1)O(1). ### 題解2 - iteration 聯想到二叉樹的中序遍歷。TBD ### Reference - [LeetCode: Validate Binary Search Tree 解題報告 - Yu's Garden - 博客園](http://www.cnblogs.com/yuzhangcmu/p/4177047.html) - 提供了4種不同的方法,思路可以參考。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看