判断是否为搜索二叉树之3种方法超棒(C++实现)

概念:每个结点都比左儿子大,比右儿子小,严格的搜索二叉树没有重复的值

法一: 

/*
* 概念:每个结点都比左儿子大,比右儿子小,严格的搜索二叉树没有重复的值
step:   1)中序遍历得到的数组的升序的
*/
int preData = INT_MIN;
bool isBST(Node* head) {
	if (head == NULL)
		return true;
	bool isLeftBST = isBST(head->left);
	if (!isLeftBST)//如果左树不是,就直接返回false
		return false;
	if (preData >= head->data)//如果根的data比左的小,就返回false
		return false;
	else {
		preData = head->data;
	}
	return isBST(head->right);
}

法二:(思路与法一差不多)

//判断是否为搜索二叉树2
#include<list>
#include<algorithm>
bool isBST2(Node* head) {
	if (head == NULL)
		return false;
	list<int> L;
	process(head, L);
	int sz = L.size();
	list<int>::iterator end = --L.end();
	for (list<int>::iterator it = L.begin();it != end;)
		if (*it >= *(++it))
			return false;
	return true;
}
void process(Node* head, list<int>& L) {
	if (head == NULL)
		return;
	process(head->left, L);
	L.push_back(head->data);
	process(head->right, L);
}

法三:

递归

/*
条件:左右子树均是搜索二叉树,且左边max<根值,右边min>根值
注意:要递归则每次规模必须一样,而左边寻找的是max,右边寻找的是min,
	  所以只能同时满足,即返回{是不是搜,min,max}.
*/
class ReturnData {
public:
	bool isSBT;
	int min;
	int max;
	ReturnData(bool isB, int mi, int ma) {
		isSBT = isB;
		min = mi;
		max = ma;
	}
};
bool isBSTFun(Node* head) {
	return process1(head)->isSBT;
}
ReturnData* process1(Node* head) {
	//因为为空,max和min没法设置,所以返回NULL,但是用的时候需要判断
	if (head == NULL)
		return NULL;//返回值不能是ReturnData类型
	ReturnData* leftData = process1(head->left);
	ReturnData* rightData = process1(head->right);
	int minData = head->data;
	int maxData = head->data;
	if (leftData != NULL) {
		minData = min(minData, leftData->min);
		maxData = max(maxData, leftData->max);
	}
	if (rightData != NULL) {
		minData = min(minData, rightData->min);
		maxData = max(maxData, rightData->max);
	}
	bool isBST = true;//先假设是搜索树,若不满足条件就置为false
	//如果左边不空,且左边不是搜索树或者左边min>根值,则false
	if (leftData != NULL && (!leftData->isSBT || leftData->min >= head->data))
		isBST = false;
	if (rightData != NULL && (!rightData->isSBT || rightData->max <= head->data))
		isBST = false;
	return &(ReturnData(isBST, minData, maxData));
}
经验分享 程序员 微信小程序 职场和发展