一、题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
例如:输入数组{5, 7, 6, 9, 11, 10, 8},则返回true,因为这个整数序列如图二叉搜索树的后序遍历结果。如果输入的数组是{7, 4, 6, 5},则由于没有哪棵二叉搜索树的后序遍历结果是这个序列,因此返回false。
二、解法
分析:在后序遍历得到的序列中,最后一个数是树的根节点的值,数组中前面的数字可以分为两部分:第一部分是左子树节点的值,他们都比根节点小,第二部分是右子树节点的值,他们都比根节点的值大。
以数组{5, 7, 6, 9, 11, 10, 8}为例,后序遍历的最后一个数字8就是根节点的值,在这个数组中,前三个数字5,7,6都比8小,是值8的左子树的节点;后三个数字9,11,10都比8大,是值8的节点的右子树的节点。下面就是一个递归过程:对于{5, 7, 6},6是左子树的根节点的值......
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int length = sequence.size();
if(length==0)
return false;
int root = sequence[length-1];
int i = 0;
for(;i<length-1;++i)
{
if (sequence[i] > root)
break;
}
int j = i;
for(;j<length-1;++j)
{
if(sequence[j]<root)
return false;
}
bool left = true;
vector<int> leftSequence;
for(int m = 0; m<i; ++m)
leftSequence.push_back(sequence[m]);
if(i>0)
left = VerifySquenceOfBST(leftSequence);
bool right = true;
vector<int> rightSequence;
for(int n=i; n<length-1;++n)
rightSequence.push_back(sequence[n]);
if(i<length-1)
right = VerifySquenceOfBST(rightSequence);
return (left&right);
}
};