**题目描述:**输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/ \
2 6
/
1 3
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
**已知条件:**后序序列最后一个值为 root,二叉搜索树的左子树的值都小于root,右子树的值都大于root。
解题思路:
- 确定根节点root,数组的最后一个元素。
- 遍历序列(除了root),找到第一个大于root的位置,该位置左边为左子树的所有元素,右边为右子树的所有元素。
- 遍历右子树,若发现有小于root的值,返回false。
- 分别判断左子树和右子树是否是二叉搜索树(即递归1 2 3)。
class Solution {
public:
bool verifyPostorder(vector<int>& postorder) {
bool res = true;
if(postorder.empty()){
return res;
}
res = IsTrue(postorder, 0, postorder.size() - 1);
return res;
}
bool IsTrue(vector<int> postorder, int start, int end){
if(postorder.empty() || start > end){
return false;
}
// 根节点
int root = postorder[end];
int i = start;
// 找到根节点的左子树 i-1
for(i; i < end; ++i){
if(postorder[i] > root){
break;
}
}
// 根节点的右子树大于根节点
for(int j = i; j < end; ++j){
if(postorder[j] < root){
return false;
}
}
// 判断左子树是不是二叉搜索树
bool left = true;
if(i > start) {
left = IsTrue(postorder, start, i - 1);
}
// 判断右子树是不是二叉搜索树
bool right = true;
if(i < end){
right = IsTrue(postorder, i, end - 1);
}
return left && right;
}
};