码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-10-09 10:55:41      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:大于   还需   star   判断   特性   重建二叉树   ==   private   直接   

(判断一个元素均不相同的序列是否为一个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);
        }

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

标签:大于   还需   star   判断   特性   重建二叉树   ==   private   直接   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!