• 《剑指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);
        	}
    
  • 相关阅读:
    iOS中NSArray的过滤
    Android SurfaceView 的应用
    让你的模拟器不再卡:VirtualBox安裝 Androidx86 4.0
    SurfaceView 绘图覆盖刷新及脏矩形刷新方法
    ios iphone开发内存管理
    IOS上的socket通信
    【转载】反射之实例创建ConstructorInfo.Invoke 对比 Activator.CreateInstance
    cookie 和session 的区别详解
    LPC2132 调试记 (转)
    三极管开关电路基础
  • 原文地址:https://www.cnblogs.com/czjk/p/11640352.html
Copyright © 2020-2023  润新知