输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true
,否则返回 false
。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5 / 2 6 / 1 3
示例 1:
输入: [1,6,3,2,5] 输出: false
示例 2:
输入: [1,3,2,6,5] 输出: true
提示:
数组长度 <= 1000
1 //二叉搜索树,根节点小于右子树所有节点,大于左子树所有节点 2 //所以根据这个特性,找到左右子树分界点,左侧都小于根,右侧都大于根 3 class Solution { 4 public boolean verifyPostorder(int[] postorder) { 5 if(postorder.length==0){return true;} 6 return fun(postorder,0,postorder.length-1); 7 } 8 public boolean fun(int[] postorder,int left,int right){ 9 if(left==right){return true;} 10 11 for(int i=left;i<right;i++){ 12 //寻找出现的第一个右子树节点 13 if(postorder[i]>postorder[right]){ 14 //在第一个右子树节点后都是右子树节点,即从i开始都大于根节点 15 for( int t=i+1;t<right;t++){ 16 if(postorder[t]<postorder[right]){return false;} //小于根false; 17 } 18 //全部都是右子树节点 19 if(i==left){return fun(postorder,left,right-1);} 20 //左右子树都有节点 21 return fun(postorder,left,i-1)&&fun(postorder,i,right-1); 22 } 23 } 24 //全部都是左子树节点 25 return fun(postorder,left,right-1); 26 } 27 }
原文:https://www.cnblogs.com/SEU-ZCY/p/14614325.html