解题思路: 后序遍历的树节点都有这么一种规律:最后一个节点为头节点,剩下的节点会分为连续的两部分,一部分都比节点大(右子树),另一部分都比节点小(左子树)
那么先取出根节点,然后倒叙遍历整个序列,如果经历了“一部分序列比根节点大”,“另一部分比节点小”那么比较成功,继续递归地比较,否则比较失败,返回false
public bool VerifySquenceOfBST(int[] sequence)
{
if(sequence.Length==0)//这个是应付用例测试用的
{
return false;
}
List<int> list=new List<int>();//为了方便起见,使用list进行测试。
for(int i=0;i<sequence.Length;i++)
{
list.Add(sequence[i]);
}
return Function(list);
}
public bool Function(List<int> list)
{
if(list.Count<=1)//如果此时遍历到的集合内只有一个节点了或者为空
{ //说明之前的检查都成功了,返回true
return true;
}
List<int> left=new List<int>();
List<int> right=new List<int>();
int root=list[list.Count-1];//保存根节点的值在root内,好比较
int p=list.Count-2;//定义p指针指向倒数第二个元素
if(p>=0 && list[p]>root)//开始检查,先是右子树
{
while(p>=0 && list[p]>root)//比root大的都加入右子树集合内
{
right.Add(list[p]);
p--;
}
}
if(p>=0 && list[p]<root)//如果前边都顺利,这里就是检查左子树
{
while(p>=0 && list[p]<root)//比root小的都加入左子树集合内
{
left.Add(list[p]);
p--;
}
}
if(p>=0)//如果序列是正确的,这个时候p指针应该遍历完整个list集合
{ //若没有,就说明之前的序列没有按照规律分布(比如出现一堆比root小的中间跳出一个比root大的),序列错误,返回false
return false;
}
return Function(left) && Function(right);
}