剑指Offer_33_二叉搜索树的后续遍历序列
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/ \
2 6
/ \
1 3
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
提示:
数组长度 <= 1000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof
解题思路
后序遍历:先输出左子树和右子树,最后输出根节点
根据后续遍历根节点在最后的特点,可以直接获得根节点的值,根据左子树每个节点值比根节点小,右子树上每个节点值比根节点大的特点,找到数组中左子树和右子树的分割位置,分割位置在最左说明只有右子树,分割位置在最右说明只有左子树,如果有多个分割位置,说明不满足二叉搜索树的条件,返回false,将数组分成左子树和右子树之后,重新之前的步骤,直至只剩下一个节点或没有节点
代码
class Solution {
public boolean verifyPostorder(int[] postorder) {
return verifyPostorder2(postorder,0,postorder.length-1);
}
public boolean verifyPostorder2(int[] postorder,int start,int end){
if(end-start<=1){
return true;
}
int root = postorder[end];
int pos = start;
while(pos < end){
if(postorder[pos]>root){
break;
}
pos++;
}
int dividPos = pos;
while(pos<end){
if(postorder[pos]<root){
return false;
}
pos++;
}
return verifyPostorder2(postorder,start,dividPos-1) && verifyPostorder2(postorder,dividPos,end-1);
}
}