BST的後序遍歷序列

遞歸:

bool pp(const vector<int> vi, int start, int end)
{
	if (start >= end)return 1;
	int i = start;
	while (i <= end && vi[i] < vi[end])i++;
	for (int j = i;j <= end;j++)if (vi[j] < vi[end])return 0;
	return pp(vi, start, i - 1) && pp(vi, i, end - 1);
}
bool VerifySquenceOfBST(vector<int> sequence)
{
	if (sequence.empty())return 0;
	if (sequence.size() == 1)return 1;
	return pp(sequence, 0, sequence.size() - 1);
}

思路:後序遍歷的最後一個元素一定是樹根。除樹根外,前面的元素可以分爲兩部分,左子樹的值和右子樹的值。左子樹的值都小於根,右子樹的值都大於根。如果在遞歸過程中發現右子樹的值小於根,那麼false。

非遞歸:

bool VerifySquenceOfBST(vector<int> sequence)
{
	if (sequence.empty())return 0;
	if (sequence.size() == 1)return 1;
	int i = 0, size = sequence.size() - 1;
	while (size > 0)
	{
		while (sequence[i] < sequence[size])i++;
		while (sequence[i] > sequence[size])i++;
		if (i < size)return 0;
		i = 0;
		size--;
	}
	return 1;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章