题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
思路:
代码:
/// 非递归
bool VerifySquenceOfBST(vector<int> sequence)
{
int size = sequence.size();
if(0 == size)
return false;
int i = 0;
while(--size)
{
/// 找到右子树的起始位置
while(sequence[i++]<sequence[size]);
/// 找到根节点
while(sequence[i++]>sequence[size]);
/// 不相等则表示找到的“根节点”不是根节点
if(i < size)
return false;
/// 排除根节点,再次遍历
i = 0;
}
return true;
}
/// 递归
bool VerifySquence(vector<int> sequeue)
{
int size = sequence.size();
if(0 == size)
return false;
return digui(sequeue, 0, size - 1);
}
bool digui(vector<int> sequeue, int head, int tail)
{
if(head >= tail)
return true;
int i = tail;
while(i > head && sequeue[i - 1] > sequeue[tail])
i--;
/// 这时已经找到了右子树,i是右子树的起始索引
/// 如果左子树有大于根节点的,返回false
for(int j = head; j < i - 1; j++)
{
if(sequeue[j] > sequeue[tail])
return false;
}
return digui(sequeue, head, i - 1) && digui(sequeue, i, tail - 1);
}