剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)

来源:互联网 发布:在淘宝卖茶叶 编辑:程序博客网 时间:2024/06/01 15:48

问题描述:

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。

思路:

1.首先后序遍历的结果是[(左子树的后序)(右子树的后序)根结点],那么我们首先找到了根结点的值,
2.其次,我们知道二叉搜索树的性质是:任何结点的左子树的值小于根结点的值,小于右子树的值。
3.因此,从后向前遍历,找到第一个小于root.val的,下标为index, 若index == n-1(n为数组的长度),则显然不满足,返回false, 否则我们可以将数组划分出来[(左子树的后序)(右子树的后序)根结点]。
4.最后对左右子树递归的判断即可。(但是这里要注意左子树或右子树为空的情况)

代码:

public boolean VerifySquenceOfBST(int [] sequence) {        if(sequence == null || sequence.length == 0){            return false;        }        int n = sequence.length;        if(n == 1 || n == 2){            return true;        }        int index = -1;        for(int i = n-2; i >= 0; i--){            if(sequence[i] < sequence[n-1]){                index = i;                break;            }        }        int[] left = new int[index+1];        int[] right = new int[n-2-index];        for(int i = 0; i <= index; i++){            if(sequence[i] > sequence[n-1]){                return false;            }            left[i] = sequence[i];        }        for(int i = index+1; i< n-1; i++){            right[i-index-1] = sequence[i];        }        if(index == n - 2 && left.length != 0){            return VerifySquenceOfBST(left);        }        if(left.length == 0){            return VerifySquenceOfBST(right);        }        if(right.length == 0){            return VerifySquenceOfBST(left);        }        return VerifySquenceOfBST(left) && VerifySquenceOfBST(right);    }
0 0