二叉搜索树的后序遍历序列

来源:互联网 发布:波士顿矩阵图怎么制作 编辑:程序博客网 时间:2024/06/07 06:16

题目

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

思路

后序遍历:左,右,根
二叉搜索树:左<根<右(题设任意两数字不同)
数组最后一项必为根节点,根节点前面的数组可分为左子树和右子树两部分
进行递归,注意递归结束条件

public class Solution {    public boolean VerifySquenceOfBST(int [] sequence) {        if(sequence==null||sequence.length==0)            return false;        int n = sequence.length;        return VerifySquenceOfBST(sequence, n);    }    public boolean VerifySquenceOfBST(int [] sequence, int length) {        int n = length;        if(n<2)            return true;        int[] left = new int[n];        int[] right = new int[n];        int i=0,j=0,k=0;        while(i<n-1){             if(sequence[i]>sequence[n-1])                 break;            left[j++] = sequence[i++];        }        while (i<n-1){            if(sequence[i]<sequence[n-1])                return false;            right[k++] = sequence[i++];        }        return VerifySquenceOfBST(left, j)&&VerifySquenceOfBST(right, k);    }}

同思路,另一种简单实现

根据数组下标确定左右子树,而不是再设两个数组,节省空间

public class Solution {    public boolean VerifySquenceOfBST(int [] sequence) {        if(sequence==null||sequence.length==0)            return false;        int n = sequence.length;        return VerifySquenceOfBST(sequence, 0,n-1);    }    public boolean VerifySquenceOfBST(int [] sequence, int start, int end) {        if(start>=end)            return true;        int left = start;        while(start<end){            if(sequence[start]>sequence[end])                break;            start++;        }        int right = start;        while (start<end){            if(sequence[start]<sequence[end])                return false;            start++;        }        return VerifySquenceOfBST(sequence, left, right-1)&&VerifySquenceOfBST(sequence, right, end-1);    }
原创粉丝点击