题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
二叉搜索树(二叉排序树/二叉查找树)
定义:若它的左(右)子树不空,则左(右)子树上所有节点的值均小于(大于)它的根节点的值.
意义:构建一棵二叉搜索树的目的不是为了排序,而是为了提高查找和删除关键字的速度.
理论思路:
后序遍历序列的最后一个数字为根节点值,则数组前面可分为两部分(连续的小于根节点的部分为左子树,第一个大于根节点的节点及其后面至根节点前的所有节点为右子树.若违背了这一规律则该序列非二叉搜索树的后序遍历序列)
代码思路:
1.在二叉搜索树有效的前提下,找到左子树的节点并判断右子树(余下节点除根节点)是否有大于根节点的;
2.若存在左子树,递归判断左子树是否为BST;同理右子树
代码
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
//判断有效性
if(sequence.empty())
return false;
//长度及根节点
int length = sequence.size();
int root = sequence[length - 1];
//定义用于找左子树的游标i
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;
//若有左子树存在,则递归判断余下
if(i > 0)
{
vector<int> leftSequence;
for(int indexLeft = 0; indexLeft < i;++indexLeft)
{
leftSequence.push_back(sequence[indexLeft]);
}
left = VerifySquenceOfBST(leftSequence);
}
//同理声明右子树标识
bool right = true;
if(i < length - 1)
{
vector<int> rightSequence;
for(int indexRight = i; indexRight < length - 1;++indexRight)
{
rightSequence.push_back(sequence[indexRight]);
}
right = VerifySquenceOfBST(rightSequence);
}
return (left && right);
}
};