题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回 true,否则返
回 false 。
例如输入 5、7、6、9、11 、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回 true。
回 false 。
例如输入 5、7、6、9、11 、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回 true。
如果输入 7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回 false 。
思路:对于树的很多问题都是可以使用递归来解决。这道题也不例外。首先明白后序遍历的特点,最后一个是根元素。左子树都比根元素打,右子树都比根元素小,然后再递归检测左右子树。
bool helper_verify(vector<int>& vec,int begin,int end)
{
int i,j;
if(end-begin <=1)
return true;
for(i=begin;i<end;i++)
if(vec[i] > vec[end])
break;
for(j=i;j<end;j++)
if(vec[j] < vec[end])
break;
if(j<end-1)
return false;
return helper_verify(vec,begin,i-1) && helper_verify(vec,i,end-1);
}
bool verifyBST(vector<int>& vec)
{
if(vec.size() <=1)
return true;
return helper_verify(vec,0,vec.size()-1);
}