判断是否是二叉查找树的后序遍历结果

题目:

输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。

例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:

    8

  /    \

6    10

/  \     /   \

5  7  9   11

因此返回true。

如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。

分析:

这是一道trilogy的笔试题,主要考查对二元查找树的理解。
在后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结点小的元素都应该位于序列的左半部分;从第一个大于跟结点开始到跟结点前面的一个元素为止,所有元素都应该大于跟结点,因为这部分元素对应的是树的右子树。根据这样的划分,把序列划分为左右两部分,我们递归地确认序列的左、右两部分是不是都是二元查找树。

代码:

#include<iostream>
#include<algorithm>

using namespace std;

int length;
int* sequence;

bool VerifySequenceOfBST(int* _sequence, int _length)
{
	if (!_sequence || _length <= 0)
		return false;

	// root of a BST is at the end of post order traversal squence
	int root = _sequence[_length - 1];

	// the nodes in left sub-tree are less than the root
	int i = 0;
	for (; i < _length - 1; i++)
		if (_sequence[i]>root)
			break;

	// the nodes in the right sub-tree are greater than the root
	int j = i;
	for (; j < _length - 1; j++)
		if (_sequence[j] < root)
			return false;

	// verify whether the left sub-tree is a BST
	bool left = true;
	if (i > 0)
		left = VerifySequenceOfBST(_sequence, i);

	// verify whether the right sub-tree is a BST
	bool right = true;
	if (_length - i - 1>0)
		right = VerifySequenceOfBST(_sequence, _length - i - 1);

	return (left&right);
}


int main()
{
/*

--------N1--------
7
5 7 6 9 10 11 8
1(true)

--------N2--------
4
7 4 6 5
0(false)

*/
	cout << "请输入数组长度: ";
	cin >> length;

	cout << "请输入" << length << "个数组元素: ";
	sequence = new int[length];
	for (int i = 0; i < length; i++)
		cin >> sequence[i];

	cout << "输入的数组是否是某一二叉查找树的后序遍历结果?\n";
	cout << VerifySequenceOfBST(sequence, length) << endl;
	
	return 0;
}

题目来自: http://www.acmerblog.com/interview-6-2421.html

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/LaoJiu_/article/details/50820226
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞