• 剑指offer-二叉搜索树的后序遍历


    /**输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
     * 如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
     * 一开始不是很明白题目意思,以为是让我后序遍历某棵二叉树
     * 后来搞明白了。
     * 二叉搜索树就像是二分查找里面的,左子树的所有元素都小于根节点,右子树的所有元素都大于根节点。
     *例如{5,7,6,9,11,10,8},8是根节点,则我们可以从头开始找比8大的节点,就可以找到左右子树的分界了
     *这时我们找到了9,然后我们在验证左子树(5,7,6)是否都小于根节点8,验证右子树(9,11,10)是否都大于根节点8.
     *然后又继续验证左子树和右子树内部是否符合,于是可以用到递归。
     *例如{7,4,5,6},6是根节点,我们可以发现这棵树没有左子树,于是我们验证(7,4,5)是否都大于根节点6
     *但是此时我们发现4并不大于根节点,说明不符合。
     *测试用例:
     *1.功能测试:左右子树都有的:{5,7,6,9,11,10,8},只有右子树的{7,4,5,6},只有左子树的{5,4,3,2,1}
     *2.边界测试:给定数组为空或者长度为0的。
     * @author admin
     *
     */
    public class VerifySequenceOfABST {
    	 public static boolean VerifySquenceOfBST(int [] sequence) {
    		 	if(sequence==null||sequence.length==0) {
    		 		return false;
    		 	}
    	        return verifySequence(0,sequence.length-2,sequence[sequence.length-1],sequence);
    	  }
    	 public static boolean verifySequence(int start,int end,int root,int[] sequence) {
    		 if(end<=start) {//当end<start时,说明不需要验证了,返回true
    			 return true;
    		 }
    		 int i=start;
    		 //找出左右子树的分界
    		 for(;i<=end;i++) {
    			 if(sequence[i]>root) {
    				 break;
    			 }
    		 }
    		 boolean left=true;
    		 //验证左子树是否都小于根
    		 for(int j=start;j<=i-1&&left;j++) {
    			 if(sequence[j]>root) {
    				 left=false;
    			 }
    		 }
    		 boolean right=true;
    		 //验证右子树是否都大于根
    		 for(int j=i;j<=end&&right;j++) {
    			 if(sequence[j]<root) {
    				 right=false;
    			 }
    		 }
    		 if(i>start) {//如果i>start,则继续往下验证,因为有可能只有右子树
    			 left=left&&verifySequence(start,i-2,sequence[i-1],sequence);
    		 }
    		 if(i<end) {//如果i<end,则继续往下验证,因为有可能只有左子树
    			 right=right&&verifySequence(i,end-1,sequence[end],sequence);
    		 }
    		 return left&&right;
    	 }
    	 public static void main(String[] args) {
    		 int[] sequence={5,4,3,2,1};
    		 System.out.println(VerifySquenceOfBST(sequence));
    		 
    	 } 
    }
    

      

  • 相关阅读:
    委托的例子,from C# advanced program
    C#线程通信与异步委托
    进程间通信
    线程间通信
    投影转换(AE)
    FTP多任务下载实现类
    堆内存和栈内存详解(转)
    How threads differ from processes
    实现远程FTP特定时间轨道号MODIS数据的搜索
    委托的例子
  • 原文地址:https://www.cnblogs.com/qingfei1994/p/4899839.html
Copyright © 2020-2023  润新知