题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则返回true,否则返回false。
假设输入的数组的任意两个数字都互不相同。
数据范围
数组长度 [0,1000]。
样例
输入:[4, 8, 6, 12, 16, 14, 10]
输出:true
要点分析
这道题值得吸收的东西是,直接根据题目给定的后序遍历,得出是否是一个二叉搜索树。
根据二叉搜索树后序遍历的性质,得出最后一个结点即为根结点,并保存。然后我们从头找出第一个大于根结点的数,这就是这颗二叉搜索树右子树的第一个结点。在右子树中,理应所有点都要比根来的大,不符合这一条件就不是二叉搜索树。接着往下递归……
同理,我们还可以推广出根据前序遍历判断二叉搜索树
后序遍历判断
class Solution {
public:
vector<int> seq;
bool verifySequenceOfBST(vector<int> sequence) {
seq = sequence;
int n = sequence.size();
return dfs(0, n-1);
}
bool dfs(int l, int r) {
if (l >= r) return true;
int root = seq[r];
int k = l;
while (k < r && seq[k] < root) k++;
for (int i = k; i < r; i++)
if (seq[i] < root) return false;
return dfs(l, k-1) && dfs(k, r-1);
}
};
前序遍历
bool dfs(int l, int r) {
if (l >= r) return true;
int root = pre[l];
int k = l + 1;
while (k < r && pre[k] < root) k++;
for (int i = k; i < r; i++)
if (pre[i] < root) return false;
return dfs(l+1, k-1) && dfs(k, r);
}