3.23 二叉搜索树的后序遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:(1)二叉搜索树的特点: 左节点值 > 父节点值 > 右节点值 (2)后序遍历特点:最后一个为根节点, 从后往前找出第一小于父节点的位置, 则前面全部都为左子树 都比父节点值小.然后依次递归比较即可.
bool VerifySquenceOfBST(std::vector<int> sequence) {
		bool ret = false;

		do
		{
			if (sequence.size() == 0) {
				break;
			}
			if (sequence.size() == 1) {
				ret = true;
				break;
			}

			ret = judgeVal(sequence, 0, sequence.size() - 1);

		} while (0);

		return ret;
	}

// 值判断   左边的值比根节点小, 右边的值比根节点大, 后序遍历,  所以最后一个是根节点
bool judgeVal(std::vector<int> sequence, int start, int end) {
	bool ret = false;

	do
	{
		if (start >= end) {
			ret = true;
			break;
		}
		int i = end;
		// 根节点为 sequence[end]  从后往前第一个比sequence[end]小的为左子树  
		while (i >= start&& sequence[i] >= sequence[end] && i--);

		// 判断左子树 右边已经判断过了 
		ret = true;
		for (int j = start;j <= i;++j) {
			if (sequence[j] >= sequence[end]) {
				ret = false;
				break;
			}
		}
		
		if (ret) {
			// 本次正确
			ret = judgeVal(sequence, start, i) && judgeVal(sequence, i==start?start:i+1, end - 1);
		}

	} while (0);

	return ret;
}
测试

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_37518595/article/details/85266138