题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
思路:判定依据为,后序遍历的结果中,左子树的所有节点值均小于父节点,且右子树均大于父节点。之后递归调用。
做法:数组最后一位是父节点,则应找出左右子树的交界位置,从数组0处开始,一直循环直到遇到大于父节点的位置结束,记为middle,之后继续从此位置向后,须保证之后的所有数字均大于根节点。代码如下:
public class IsPostOrder {
/**
* 判断数组是否后序遍历结果
* @param a
* 数组a
* @param low
* 待判定子数组的起始位
* @param high
* 待判定子数组的最高位
* @return
*/
public boolean isPostOrder(int[] a, int low, int high){
int i=low;
while(a[i]<a[high]){
i++;
}
int middle = i;
for(;i<high;i++){
if(a[i]<a[high]){
return false;
}
}
//如果以上两条均满足,则进行递归调用
if(low<middle-1) isPostOrder(a, low, middle-1);
if(middle<high-1) isPostOrder(a, middle, high-1);
return true;
}
public static void main(String[] args) {
int[] r = {5, 7, 6, 9, 11, 10, 8};
// int[] r = {7,4,6,5};
IsPostOrder ib = new IsPostOrder();
System.out.println(ib.isPostOrder(r, 0, r.length-1));
}
}