第23题——二叉搜索树的后序序列

158 阅读1分钟

题目:

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

思路:

利用递归的思想,在序列sequence中首先找到左子树的根,用i表示,那么右子树的第一个数就是i+1。右子树中判断各数是否大于根(根就是序列sequence的最后一个),出现不大于根的情况就返回false。

Java

package nowcoder;

public class S23_VerifySquenceOfBST {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length == 0)
            return false;
        if(sequence.length == 1)
            return true;
        return judge(sequence, 0, sequence.length-1);
    }
    public boolean judge(int []a, int start, int end){
        if(start >= end)
            return true;
        int i = start;
        while(a[i] < a[end]){
            ++i;
        }
        for(int j=i;j<end;j++){
            if(a[j]< a[end])
                return false;
        }
        return judge(a,start,i-1) && judge(a,i,end-1);
    }
    public static void main(String[] args){
        S23_VerifySquenceOfBST s23 = new S23_VerifySquenceOfBST();
        int[] sequence = {3, 5, 4, 7, 9, 8, 2};
        System.out.println(s23.VerifySquenceOfBST(sequence));
    }
}

Python

class VerifySquenceOfBST:
    def verifySquenceOfBST(self, sequence):
        if len(sequence) == 0:
            return False
        if len(sequence) == 1:
            return True
        root = sequence[-1]
        i = 0
        #左子树个数i
        for node in sequence[:-1]:
            if node > root:
                break
            i += 1
        for node in sequence[i+1:-1]:
            if node < root:
                return False
        return self.verifySquenceOfBST(sequence[:i]) or self.verifySquenceOfBST(sequence[i+1:-1])

if __name__ == '__main__':
    test = VerifySquenceOfBST()
    sequence = [3, 5, 4, 7, 9, 8, 6]
    print(test.verifySquenceOfBST(sequence))