[剑指offer学习心得]之:二叉搜索树的后序遍历序列

来源:互联网 发布:淘宝可以邮寄到国外吗 编辑:程序博客网 时间:2024/06/01 07:21

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

解题思路

在后序遍历得到的序列中, 最后一个数字是树的根结点的值。数组中前面的数字可以分为两部分: 第一部分是左子树结点的值,它们都比根结点的值小: 第二部分是右子树结点的值,它们都比根结点的值大。

这就是规律啦,也是一个递归的方式实现。

测试用例

  1. 功能测试(输入的后序遍历的序列对应一棵二叉树,包括完全二叉树,所有结点都没有左/右子树的二叉树、只有一个结点的二叉树;输入的后序遍历的序列没有对应一棵二叉树)
  2. 特殊输入测试(指向后序遍历的是null)

代码

public class VerifySquenceOfBST {    public static boolean verifySquenceOfBST(int[] sq){        if(sq==null||sq.length<=0){            return false;        }        return verifySquenceOfBST(sq,0,sq.length-1);    }    public static boolean verifySquenceOfBST(int[] sq,int low,int high){        if(low>=high){            return true;        }        int index=low;        while(index<high-1&&sq[index]<sq[high]){            index++;        }        int right=index;        while(index<high-1&&sq[index]>sq[high]){            index++;        }        if(index!=high-1){            return false;        }        index=right;        return verifySquenceOfBST(sq,low,index-1)&&verifySquenceOfBST(sq,index,high-1);    }    public static void main(String[] args) {        //           10        //         /   \        //        6     14        //       /\     /\        //      4  8  12  16        int[] data = {4, 8, 6, 12, 16, 14, 10};        System.out.println("true: " + verifySquenceOfBST(data));        //           5        //          / \        //         4   7        //            /        //           6        int[] data2 = {4, 6, 7, 5};        System.out.println("true: " + verifySquenceOfBST(data2));        //               5        //              /        //             4        //            /        //           3        //          /        //         2        //        /        //       1        int[] data3 = {1, 2, 3, 4, 5};        System.out.println("true: " + verifySquenceOfBST(data3));        // 1        //  \        //   2        //    \        //     3        //      \        //       4        //        \        //         5        int[] data4 = {5, 4, 3, 2, 1};        System.out.println("true: " + verifySquenceOfBST(data4));        // 树中只有1个结点        int[] data5 = {5};        System.out.println("true: " + verifySquenceOfBST(data5));        int[] data6 = {7, 4, 6, 5};        System.out.println("false: " + verifySquenceOfBST(data6));        int[] data7 = {4, 6, 12, 8, 16, 14, 10};        System.out.println("false: " + verifySquenceOfBST(data7));    }}
0 0