oral_quiz->#判断sequence是否BST的遍历(后根)#

#include <stdio.h>
#include <exception>
#include "Utilities/BinaryTree.h"

bool IfSequencePostorderOfBST(int* sequence, int* start, int* end) {
	if(sequence == NULL || start < sequence || start > end)
		return false;

	bool bPossible = true;
	if(start == end)		//Debug1:7 8行拿到10 11行前面
		return bPossible;

	int rootValue = *end;
	--end;

	if(*start < rootValue && *end > rootValue) {
		int *pTemp1 = start, *pTemp2 = end;
		while(*(pTemp1+1) < rootValue)
			++pTemp1;
		while(*(pTemp2-1) > rootValue)
			--pTemp2;
		if(1 != pTemp2-pTemp1 ||
				(!IfSequencePostorderOfBST(sequence, start, pTemp1)) ||
				(!IfSequencePostorderOfBST(sequence, pTemp2, end)))
			bPossible = false;
	}
	else if(*start < *end && *start > rootValue) {
		int *pTemp = start;
		while(*(pTemp+1) > rootValue)
			++pTemp;
		if(pTemp < end || !IfSequencePostorderOfBST(sequence, start, end))
			bPossible = false;
	}
	else if(*start < *end && *end < rootValue) {
		int *pTemp = start;
		while(*(pTemp+1) < rootValue)
			++pTemp;
		if(pTemp < end || !IfSequencePostorderOfBST(sequence, start, end))
			bPossible = false;
	}
	else
		bPossible = false;

	return bPossible;
}

bool VerifySequenceOfBST(int* sequence, int length) {
	if(sequence == NULL || length <= 0)
		return false;

	int root = sequence[length - 1];

	//left subtree
	int i=0;
	for(; i<length-1; ++i) {
		if(sequence[i] > root)
			break;
	}
	//right subtree
	int j=i;
	for(; j<length-1; ++j) {
		if(sequence[j] < root)
			return false;
	}

	bool left = true;
	if(i > 0)
		left = VerifySequenceOfBST(sequence, i);
	bool right = true;
	if(i < length - 1)
		right = VerifySequenceOfBST(sequence, length-2-i+1);

	return left && right;
}

void Test(const char* testName, int* sequence, int* start, int* end, bool expected) {
	if(testName != NULL)
		printf("%s begins:\n", testName);

//	if(expected == IfSequencePostorderOfBST(sequence, start, end))
	if(expected == VerifySequenceOfBST(sequence, end-start+1))
		printf("passed.\n");
	else
		printf("failed.\n");
}

//yes
void Test1() {
	int sequence[] = {5,7,6,9,11,10,8};
	Test("Test1", sequence, sequence, sequence+6, true);
}

//no
void Test2() {
	int sequence[] = {7,4,6,5};
	Test("Test2", sequence, sequence, sequence+3, false);
}

//only one number
void Test3() {
	int sequence[] = {7};
	Test("Test3", sequence, sequence, sequence, true);
}

//NULL
void Test4() {
	Test("Test4", NULL, NULL, NULL, false);
}

int main(int argc, char* argv[]) {
	Test1();
	Test2();
	Test3();
	Test4();

	return 0;
}



你可能感兴趣的:(BST,是否,遍历序列)