【剑指】33.二叉搜索树的后序遍历序列

题目描述

  • 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。

算法分析

  • 递归法:BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。
  • 迭代法:左子树一定比右子树小,因此去掉根后,数字分为left,right两部分,right部分的最后一个数字是右子树的根,他比左子树所有值大,也比right的左子树大,因此我们可以每次只看右子树是否符合条件即可。

提交代码:

class Solution {
public:
	/* 迭代法 */
	bool VerifySquenceOfBST(vector<int> sequence) {
		if (sequence.empty())
			return false;

		int size = sequence.size();
		int i = 0;

		while (--size)
		{
			while (sequence[i++] < sequence[size]);
			while (i <= size && sequence[i++] > sequence[size]);

			if (i < size)
				return false;
			i = 0;
		}

		return true;
	}

	/* 递归法 */
	bool VerifySquenceOfBST2(vector<int> sequence) {
		if (sequence.empty())
			return false;

		return VerifySquenceOfBSTCore(sequence, 
			0, sequence.size() - 1);
	}
	
	bool VerifySquenceOfBSTCore(vector<int> &seq, int beg, int end)
	{
		if (beg >= end)
			return true;

		int i = beg;
		for (; i < end; ++i)
		{
			if (seq[i] > seq[end])
				break;
		}

		int j = i;
		for (; j < end; ++j)
		{
			if (seq[j] < seq[end])
				return false;
		}

		return VerifySquenceOfBSTCore(seq, beg, i - 1) 
			&& VerifySquenceOfBSTCore(seq, i, end - 1);
	}
};

测试代码:

// ====================测试代码====================
void Test(const char* testName, vector<int> sequence, bool expected)
{
	if (testName != nullptr)
		printf("%s begins: ", testName);
	
	Solution s;
	if (s.VerifySquenceOfBST(sequence) == expected)
		printf("passed.\n");
	else
		printf("failed.\n");
}

//            10
//         /      \
//        6        14
//       /\        /\
//      4  8     12  16
void Test1()
{
	vector<int> data = { 4, 8, 6, 12, 16, 14, 10 };
	Test("Test1", data, true);
}

//           5
//          / \
//         4   7
//            /
//           6
void Test2()
{
	vector<int> data = { 4, 6, 7, 5 };
	Test("Test2", data, true);
}

//               5
//              /
//             4
//            /
//           3
//          /
//         2
//        /
//       1
void Test3()
{
	vector<int> data = { 1, 2, 3, 4, 5 };
	Test("Test3", data, true);
}

// 1
//  \
//   2
//    \
//     3
//      \
//       4
//        \
//         5
void Test4()
{
	vector<int> data = { 5, 4, 3, 2, 1 };
	Test("Test4", data, true);
}

// 树中只有1个结点
void Test5()
{
	vector<int> data = { 5 };
	Test("Test5", data, true);
}

void Test6()
{
	vector<int> data = { 7, 4, 6, 5 };
	Test("Test6", data, false);
}

void Test7()
{
	vector<int> data = { 4, 6, 12, 8, 16, 14, 10 };
	Test("Test7", data, false);
}

void Test8()
{
	Test("Test8", vector<int>(), false);
}

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

	return 0;
}

猜你喜欢

转载自blog.csdn.net/ansizhong9191/article/details/80951107