题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
二叉搜索树相关知识点:
1.左子树上所有节点的key值都小于或等于根节点。 2.右子树上所有节点的key值都大于或等于根节点。3.中序遍历二搜索树将得到有序数组。4.查找所需的最大次数等同于二叉查找树的高度。
注意:二叉搜索树不一定是平衡二叉树;
解题思路:
后序遍历二叉搜索树的最后一个元素是二叉搜索树的根节点,并且从后序遍历序列的开始会存在连续序列小于(或等于)根节点的数值,剩余的连续元素数值应该不小于根节点的数值;否则将不是二叉搜索树的后序遍历序列;递归地判断小于(或等于)根节点的连续序列以及剩余的不小于根节点的连续序列是否符合上述二叉搜索树后续遍历序列的特点,从而解决问题。
拓展:二叉搜索树先序遍历序列的判断思路类似,只是根节点的元素为序列的开头元素。
通过代码:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty())
return false;
vector<int> leftSeq;
vector<int> rightSeq;
int len = sequence.size();
int rootNum = sequence[len - 1];
int i = 0;
for(;i < len - 1; ++i)
{
if(sequence[i] > rootNum)
break;
leftSeq.push_back(sequence[i]);
}
for(int j = i; j < len - 1; ++j)
{
if(sequence[j] < rootNum)
return false;
rightSeq.push_back(sequence[j]);
}
bool leftResult = true;
if(!leftSeq.empty())
{
leftResult = VerifySquenceOfBST(leftSeq);
}
bool rightResult = true;
if(!rightSeq.empty())
{
rightResult = VerifySquenceOfBST(rightSeq);
}
return leftResult && rightResult;
}
};