1. 程式人生 > >判斷給定二叉樹是否是二叉搜尋樹(LeetCode: Validate Binary Search Tree)

判斷給定二叉樹是否是二叉搜尋樹(LeetCode: Validate Binary Search Tree)

        原題: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),以此類推。

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;
	}
};
        方法2:二叉搜尋樹的中序遍歷結果是一個嚴格遞增的序列,利用這一約束條件也可以判斷出是否是二叉搜尋樹。
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)。