面试题24:二叉搜索树的后序遍历序列
题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
分析
例如输入{5,7,6,9,11,10,8},则返回true;输入{7,4,6,5},则返回false。
在后序遍历得到的序列中,最后一个数字是树的根结点。数组前面的数字可以分成两部分:第一部分是左子树结点的值,它们都比根结点的值小;第二部分是右子树的值,它们都比根结点的值大。
以数组{5,7,6,9,11,10,8}为例,后序遍历序列的最后一个结点的值为8,也就是根结点的值为8。在这个数组中,前3个数字5,7,6都比8小,是值为8的结点的左子树结点;后3个数字9,11和10都比8大,是值为8的结点的右子树结点。
我们接下来用相同的方法确定与数组每一部分对应的子树的结构。这其实就是一个递归的过程。
C++代码
#include<vector>
#include<iostream>
using namespace std;
bool VerifySquenceOfBST(vector<int> sequence) {
int length = sequence.size();
if(length==0) return false;
int root = sequence[length-1];
//iter1用来定位到右子树的第一个节点
vector<int>::iterator iter1 = sequence.begin();
for(iter1;iter1!=sequence.end()-1;++iter1) {
if(*iter1>root)
break;
}
//在右子树中比较,如果出现值小于根结点的情况,则返回false
vector<int>::iterator iter2=iter1;
for(iter2;iter2!=sequence.end()-1;++iter2){
if(*iter2<root)
return false;
}
//lsequence和rsequence分别表示
//sequence中的左子树序列和右子树序列
vector<int> lsequence(sequence.begin(),iter1);
vector<int> rsequence(iter1,sequence.end()-1);
//对左子树和右子树递归
bool left = true;
if(iter1!=sequence.begin())
left = VerifySquenceOfBST(lsequence);
bool right = true;
if(iter2!=sequence.end()-1)
right = VerifySquenceOfBST(rsequence);
return (left && right);
}
int main() {
vector<int> test{7,4,6,5};
bool res = VerifySquenceOfBST(test);
cout<<"res="<<res<<endl;
return 0;
}