leetcode-剑指 Offer 33. 二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
提示:
数组长度 <= 1000
解题思路:
根据题目描述提及这是一棵二叉搜索树,根节点左子树的值都是比根节点的值小,而根节点的右子树的值都是大于根节点值。
1、后序遍历的最后一个节点应该是根节
2、对数组进行递归(不断地对左右子树递归):
根节点的左侧应该是比根节点小,右边比根节点值大,不满足false
最后一个节点应该是根节点,不满足false
class Solution {
private:
bool dfs(vector<int>& postorder, int start, int end)
{
if(start>=end) return true; // 只有一个结点
int p=start;
int rootval=postorder[end];
while(postorder[p]<rootval)
++p;
int leftEnd=p-1;
while(postorder[p]>rootval)
++p;
return p==end&&dfs(postorder,start,leftEnd)&&dfs(postorder,leftEnd+1,end-1);
}
public:
bool verifyPostorder(vector<int>& postorder) {
return dfs(postorder, 0, postorder.size()-1);
}
};