输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/ \
2 6
/ \
1 3
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
提示:
数组长度 <= 1000
作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/5vwxx5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
使用递归分治的思路:
x
,划分为左右子数组;
i
,在此处划分数组[start,i-1]
和[i,end]
;x
,右数组的元素均大于x
。
x
的大小关系已经确定,只需要检查右数组和x
的大小关系即可。false
;否则继续执行下一步终止条件:数组为空或者只有一个元素,返回true
//数组
int len=arrayname.length;//数组长度
class Solution {
public boolean verifyPostorder(int[] postorder) {
return recur(postorder,0,postorder.length-1);
}
public boolean recur(int[] postorder,int start,int end){
if(end-start<=1){
return true;
}
else{
int root_val=postorder[end];
int i=start;
for(i=start;i<end;i++){
if(postorder[i]>root_val){
break;
}
}
//得到i,左右数组[start,i-1],[i,end-1]
//检查左右数组
int flag=0;
for(int j=i;j<end && flag==0;j++){
if(postorder[j]<root_val){
flag=1;
}
}
if(flag==0){
return recur(postorder,start,i-1)&&recur(postorder,i,end-1);
}
else{
return false;
}
}
}
}
StackOverflowError
递归函数的部分为:
if(flag==0){
return recur(postorder,start,i-1)&&recur(postorder,i,end-1);
}
而我一开始写成了:
if(flag==0){
return recur(postorder,start,i-1)&&recur(postorder,i,end);
}
然后一直报错显示StackOverflowError
,后来发现是右数组划分的时候,传入end
就会导致后序遍历一直停留在和根节点的比较上,无法退出循环,导致栈溢出。
leetcode《图解数据结构》剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。
leetcode《图解数据结构》剑指 Offer 32 - I. 从上到下打印二叉树的解题思路和java代码,并附上java中常用数据结构的功能函数。
leetcode《图解数据结构》剑指 Offer 32 - II. 从上到下打印二叉树II 的解题思路和java代码,并附上java中常用数据结构的功能函数。
leetcode《图解数据结构》剑指 Offer 32 - III. 从上到下打印二叉树 III(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。
leetcode《图解数据结构》剑指 Offer 34. 二叉树中和为某一值的路径(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。
leetcode《图解数据结构》剑指 Offer 55 - I. 二叉树的深度(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。
leetcode《图解数据结构》剑指 Offer 55 - II. 平衡二叉树(java解题)的解题思路和java代码,并附上java中常用数据结构的功能函数。