输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:找到第一个右子树节点,然后看该节点和根之间的节点有没有比根小的,如果有,说明该树不是二叉搜索树
class Solution {
public boolean verifyPostorder(int[] postorder) {
//如果少于三个节点,咋放都是后续遍历
if(postorder == null || postorder.length < 3) {
return true;
}
return check(postorder, 0, postorder.length - 1);
}
public boolean check(int [] postorder, int l,int r) {
//最后一个节点是当前子树的根节点
int parent = postorder[r];
int firstR = l;
//找到第一个右面的子节点
for(;firstR < r && postorder[firstR] < parent; firstR++);
int rchild;
//看第一个右子节点和根节点之间有没有比根节点小的节点,有的话就不是后续遍历
for(rchild = firstR; rchild < r && postorder[rchild] > parent; rchild++);
if(rchild < r) {
return false;
}
boolean left,right;
left = right = true;
//如果firstR不是传入的第一个节点,说明该子树还有左子树,看看左子树是不是二叉搜索树
if(firstR > l){
left = check(postorder,l,firstR - 1);
}
如果firstR不是传入最后一个节点,说明该子树还有右子树,看看右子树是不是二叉搜索树
if(firstR < r){
right = check(postorder,firstR,r-1);
}
return left && right;
}
}