题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
(1)首先要清晰明白搜索二叉树的定义及其特点。左子树≤根,根≤右子树。而本题中明确指明没有重复数字。
(2)二叉树后序遍历的特点:左子树->右子树->根结点。
以序列【3 5 4 7 9 8 6】为例子,因为后序遍历,所以最后一个数必为根节点(6),而 <6 的部分为左子树部分,>6部分为右子树部分。找到第一个大于6的位置,即下标3(数值7),因为右边均要比根(6)大,所以从下标3开始遍历,一一比较后面的数是否大于6,如果满足就继续递归。左子树【3 5 4】这里4又为根结点,右子树【7 9 8】这里8又为根结点,所以按照前面方法继续判断。也就是递归。
代码
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
return bst(sequence, 0, sequence.size() - 1);
}
private:
bool bst(vector<int> seq, int begin, int end){
// 边界条件
if(seq.empty() || begin > end)
return false;
// 划分左右子树,并判断左右子树和根节点的关系
int i = begin;
for(; i < end; ++i)
if(seq[i] > seq[end])
break;
int j = i;
for(; j < end; ++j)
if(seq[j] < seq[end])
return false;
// 判断左子树是不是二叉搜索树
bool left = true;
if(i > begin)
left = bst(seq, begin, i - 1);
// 判断右子树是不是二叉搜索树
bool right = true;
if(i < end - 1)
right = bst(seq, i , end - 1);
return left && right;
}
};