剑指offer 面试题24 二叉搜索树的后序遍历序列

来源:互联网 发布:淘宝旺铺助手 编辑:程序博客网 时间:2024/05/18 09:41

剑指offer 面试题24 二叉搜索树的后序遍历序列

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

package algorithm.foroffer.top30;/** * Created by liyazhou on 2017/5/28. * 面试题24:二叉搜索树的后序遍历序列 * * 题目: *      输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。 *      如果是则返回 true,否则返回 false。 *      假设输入的数组的任意两个数字都互不相同。 * * 问题: *      1. 二叉搜索树的性质 *      2. 二叉树的后序遍历结果的特点 *      3. 递归 * * 思路: *      1. 二叉搜索树的性质,根结点比左孩子大,根结点比右孩子小 *      2. 二叉树的后序遍历结果,最后的一个结点总是根结点 *      3. 以最后一个元素作为分割点,将后序遍历结果分为两部分,其左子树和右子树的后序遍历结果 *         判断每一个棵子树的是否满足条件,根结点比左孩子大,根结点比右孩子小 * */public class Test24 {    public static boolean vertifySeqOfBST(int[] postorder, int start, int end){        // System.out.println(String.format("start, end = %d, %d", start, end));        // 应该在传入参数之前判断,免得每次递归都得进行判断        if (postorder == null) return false;        int split;        for (split = start; split < end - 1; split++){  // 最后一个元素是根结点,不判断            if (postorder[split] > postorder[end-1])  break;        }        // 递归终止条件        // 如果根结点比其右孩子大,则返回 false        for (int i = split; i < end; i++)            if (postorder[i] < postorder[end - 1]) return false;        boolean left = true;        // 有条件的递归,其递归终止条件是 split <= start        if (split > start) // 该区间的元素大于或者等于 2 个            left = vertifySeqOfBST(postorder, start, split);        boolean right = true;        // 有条件的递归,其递归终止条件是 split >= end-1        if (split < end-1)  // 该区间的元素大于或者等于 2 个            right = vertifySeqOfBST(postorder, split, end-1); // 最后一个元素是根结点,不进入下一轮        return (left && right);    }    public static void main(String[] args){        int[][] seqs = {                {5, 7, 6, 9, 11, 10, 8},                {5, 7, 6, 9, 11, 5, 8}        };        for (int i = 0; i < seqs.length; i++)            System.out.println(Test24.vertifySeqOfBST(seqs[i], 0, seqs[i].length));    }}
阅读全文
1 0
原创粉丝点击