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

时间:2019-10-09
本文章向大家介绍《剑指offer》面试题24 二叉搜索树的后序遍历序列 Java版,主要包括《剑指offer》面试题24 二叉搜索树的后序遍历序列 Java版使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

(判断一个元素均不相同的序列是否为一个BST的LRD)

书中方法:首先对于二叉搜索树,左子树中的所有元素小于根节点小于右子树中的所有元素,然后后序遍历序列最后一个元素是根节点,这是我们已知的条件。这道题不禁让人想起用一个普通二叉树的前序(或后序)遍历序列加上中序遍历序列就可以还原一棵二叉树,在那道题中,我们知道前序或后序序列就能开始组织根节点,但是因为我们无法确定子树的个数,所以还需要一个辅助的序列来确定子树范围。但如果改成BST的前序或后序遍历序列,我们就可以直接组织二叉树,BST的特性帮我们确定了子树的范围。对于这道题,我们要判断一个序列是不是BST的后序遍历序列,同样可以用确定根节点的思路,但是这里不需要重建二叉树,我们只需要在当前递归中判断两个子序列是不是有效的就行。我们先找到根节点(最后一个元素),然后用它找到左右子树的分割点,判断分割点右侧是不是都大于根节点,如果是就去递归检查分割点左边和分割点右边的两个子序列。

        public boolean judge(int[] a){
            if(a == null)return false;
            if(a.length == 0)return true;
            return myJudge(a, 0, a.length-1);
        }
        
        private boolean myJudge(int[] a, int start, int end){
            //加上等号也可以
            if(start > end)return true;
            int leftEnd = start-1;
            for(int i=start; i<=end-1; i++){
                if(a[i]<a[end]){
                    leftEnd++;
                }
            }
            for(int i=leftEnd+1; i<=end-1; i++){
                if(a[i] < a[end]){
                    return false;
                }
            }
            return myJudge(a, start, leftEnd) && myJudge(a, leftEnd+1, end-1);
        }

原文地址:https://www.cnblogs.com/czjk/p/11640352.html