思路
由于是后序遍历,所以最后一个结点就是根节点,又因为是二叉搜索树,所以从第一个结点开始所有比它小的结点就是它的左子树,其他就是它的右子树。如果右子树有点不大于根节点的话就说明不是一棵二叉搜索树,返回$false$。最后递归处理左右子树。
代码
class Solution {
public:
vector<int> seq;//设成全局变量方便操作
bool verifySequenceOfBST(vector<int> sequence) {
seq = sequence;
return dfs(0, seq.size() - 1);
}
bool dfs(int l, int r)
{
//如果区间内啥也没有就说明把所有的结点都判断完了,却没有一个是有问题的,所以返回true
if (l >= r)
return true;
//取出根节点
int root = seq[r];
//找出所有从l开始连续的比根节点小的结点
int k = l;
while (k < r && seq[k] < root)
k ++;
//这时k就是右子树后序遍历中的第一个结点
//如果不满足二叉搜索树的性质就返回false
for (int i = k; i < r; i ++)
if (seq[i] < root)
return false;
//递归处理左右子树
//y总的视频里的代码是错的
//他写的是return dfs(l, k - 1) && dfs(k + 1, r);
//这样会WA
return dfs(l, k - 1) && dfs(k, r - 1);
}
};
感谢观看!(^o^)/
$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\mathcal{writer\enspace by \enspace acwing}$ : $\mathfrak{天元之弈}$
.....