二叉搜索树的后序遍历序列(剑指Offer-33)
题面
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
1 5 2 / \ 3 2 6 4 / \ 5 1 3
示例
示例 1:
1输入: [1,6,3,2,5]
2输出: false
示例 2:
1输入: [1,3,2,6,5]
2输出: true
限制
1数组长度 <= 1000
思路
按照后续遍历的实现最后一个元素是根节点, 比根节点的小的说明是在左子树,比根节点大的说明在右子树。
代码
1class Solution {
2 bool dfs(vector<int>& postorder, int start, int end){
3 if(start >= end) return true;
4
5 int p = start;
6 int rootval = postorder[end];
7 while(postorder[p] < rootval){
8 ++p;
9 }
10 int leftEnd = p-1;
11
12 while(postorder[p] > rootval){
13 ++p;
14 }
15
16 return p==end && dfs(postorder, start, leftEnd) && dfs(postorder, leftEnd+1, end-1);
17 }
18public:
19 bool verifyPostorder(vector<int>& postorder) {
20 return dfs(postorder, 0, postorder.size()-1);
21 }
22};