题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果.
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
分析:
判断其是否为二元查找树的后序遍历结果,就需要知道后序遍历的特定:最后一个元素为根;又因为为二元查找树,即任意一个元素的值都大于左子节点的值,小于右子节点的值。所以,在遍历该序列时,从遇到第一个大于根元素的值开始一直到根元素之前,都是位于该元素的右子树上,而从第一个元素到第一个大于该根元素的值之前,都位于该根元素的左子树上;我们可以依此来对该序列进行左右子树划分,然后再对划分得到的左右子树递归……
bool IsAfer(int squ[], int length)
{
if(squ == NULL || length <= 0)
return false;
int root = squ[length - 1];
int i = 0;
for(; i < length - 1; ++ i)
{
if(squ[i] > root)
break;
}
int j = i;
for(; j < length - 1; ++ j)
{
if(squ[j] < root)
return false;
}
bool left = true;
if(i > 0)
left = IsAfer(squ, i);
bool right = true;
if(i < length - 1)
right = IsAfer(squ + i, length - i - 1);
return (left && right);
}