判定一个组数是否是一个搜索二叉数的后序遍历
对于一个序列arr,最后一个元素是arr[len] (也就是根root),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于root,后一段(右子树)大于root,且这两段(子树)都是合法的后序序列。完美的递归定义 。
第一种方法:
bool Ispostsort(int* arr,int left,int right)
{
if (right>=left)
return true;
int i = right;
while (i > 0 && arr[i - 1] > arr[right])//找比arr[right]=root小的数
{
i--;
} // 5 7 6 9 11 10 8
int j = i - 1;
for (; j > 0;--j)//找比arr[right]=root小的数
{
if (arr[j] > arr[right])
return false;
}
return Ispostsort(arr,left,j) && Ispostsort(arr,i,right-1);
}
第二种方法;
bool Ispostsort(int* arr, int n)
{
if (arr == NULL || n < 0)
return false;
int root = arr[n];
int i = 0;
for (; i < n - 1; ++i)
{
if (arr[i] > root)
break;
}
int j = i;
for (; j < n - 1; j++)
{
if (arr[j] < root)
return false;
}
bool left = true;
if (i>0)
left = Ispostsort(arr, i-1);
bool right = true;
if (j < n - 1)
{
right = Ispostsort(arr+i, n-i-1);
}
return left&&right;
}
两种方法思路相同,只是传递的参数不同。