判斷給定二叉樹是否是二叉搜尋樹(LeetCode: Validate Binary Search Tree)
阿新 • • 發佈:2018-12-24
原題:Given a binary tree, determine if it is a valid binary search tree (BST).
方法1:可以根據二叉搜尋樹的規律寫出約束規則。對於二叉搜尋樹的任意結點,其左子樹結點均小於結點本身值,右子樹結點均大於結點本身值。根據這個規律可以給出兩個變數min和max來限定每個結點的有效取值範圍。假設任一結點current的取值範圍為(min,max),則左子女的取值範圍為(min,current->val),右子女的取值範圍為(current-> val,max),以此類推。
方法2:二叉搜尋樹的中序遍歷結果是一個嚴格遞增的序列,利用這一約束條件也可以判斷出是否是二叉搜尋樹。class Solution { public: bool isValidBST(TreeNode *root) { return subTree(root,LLONG_MIN,LLONG_MAX); } private: //由於測試案例中含有INT_MIN和INT_MAX, //所以這裡不能用int型表示最大值和最小值 bool subTree(TreeNode *root,long long min,long long max){ if(root==NULL) return true; if( root->val < max && root->val > min && subTree(root->left,min,root->val) && subTree(root->right,root->val,max)) return true; else return false; } };
class Solution { public: bool isValidBST(TreeNode *root) { last = LLONG_MIN; return inOrder(root); } private: long long last;//儲存中序遍歷的上一個值 bool inOrder(TreeNode *root){ if(root){ if(!inOrder(root->left)) return false; if(root->val <= last) return false; last = root->val; if(!inOrder(root->right)) return false; } return true; } };
總結:上述兩種方法的時間複雜度都是O(n),遞迴的空間複雜度也都是O(logn)。