zoukankan      html  css  js  c++  java
  • 剑指offer系列21--二叉搜索树的后续遍历序列

    * 21【题目】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
    *      如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
    *    【注】二叉搜索树特点:左子树比根结点值小,右子树比根结点值大。
    *    【思路】①根据后序遍历结果确定根结点;
    *     ②判断所有左子树是否比根结点值小;
    *     ③判断所有右子树是否比根结点值大;
        * ④使用递归,继续分别判断左右子树中是否符合这一特点。

    package com.exe5.offer;
    
    /**
     * 21【题目】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
     *             如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
     *    【注】二叉搜索树特点:左子树比根结点值小,右子树比根结点值大。
     *    【思路】①根据后序遍历结果确定根结点;
     *             ②判断所有左子树是否比根结点值小;
     *             ③判断所有右子树是否比根结点值大;
     *           ④使用递归,继续分别判断左右子树中是否符合这一特点。
     * @author WGS
     *
     */
    public class VerifySequenceOfBST {
    
        public boolean verifySequenceOfBST(int[] arrOfPostOrder){
            if(arrOfPostOrder==null) return false;
            int len=arrOfPostOrder.length;//7
            System.out.println("len:"+len);//7
            int rootVal=arrOfPostOrder[len-1];//根据后序遍历结果得到根结点值
            //判断左子树(<根结点值)
            int i=0;
            for(;i<len-1;i++){//3
                if(arrOfPostOrder[i]>rootVal)
                     break;
            }
            System.out.println(i);//3
            //判断右子树(>根结点值)
            for(int j=i;j<len-1;j++){
                if(arrOfPostOrder[j]<rootVal)
                     return false;
            }
            //继续判断左子树
            int[] leftTree=new int[(len-1)/2];//3
            System.arraycopy(arrOfPostOrder, 0, leftTree, 0, (len-1)/2);
            boolean leftFlag=true;
            if(i>0){
                leftFlag=verifySequenceOfBST(leftTree);
            }
            //继续判断右子树
            int[] rightTree=new int[(len-1)/2];//需要注意到的是此处建立数组时长度是在不断发生变化的
            System.arraycopy(arrOfPostOrder, (len-1)/2, leftTree, 0,len-i-1);
            boolean rightFlag=true;
            if(i<arrOfPostOrder.length-1){
                rightFlag=verifySequenceOfBST(rightTree);
            }
        
            return leftFlag&&rightFlag;
            
            
        }
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int[] arr=new int[]{5,7,6,9,11,10,8};
            System.out.println(new VerifySequenceOfBST().verifySequenceOfBST(arr));
        }
    
    }
  • 相关阅读:
    小知识,大应用--正交向量在CDMA中的运用
    翻译:做好iPhone程序的10点建议
    解决了对多层结构一些疑惑,整理一下!
    原来是这样的——生活中的随笔
    3.14..............
    基础 - 结构
    推荐一本书《我编程,我快乐》
    基础 - 异常处理
    今天发现一个以前写的管理代码片段的程序,把源码发出来!
    VNC快速教程
  • 原文地址:https://www.cnblogs.com/noaman/p/5458098.html
Copyright © 2011-2022 走看看