为了账号安全,请及时绑定邮箱和手机立即绑定

剑指Offer-二叉搜索树的后序遍历序列

标签:
Java 算法

        最近一直在复习一些算法及数据结构方面的东西,就找了一个适合找工作笔试的题目,在剑指Offer上刷了几道题目,发现对复习知识点还是很有用的,推荐要找工作的伙伴去剑指Offer刷题。

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。


看到这道题,给出了二叉排序树(bst)的后序遍历数组,根据二叉排序树的特点,可以知道,中序遍历肯定是按从小到大的顺序排列的,所以我就直接,先对数组进行冒泡排序(当然其他排序都行,只要不超时就行了,不过剑指Offer的数据量还是比较小的,可以忽略),排序之后其实就是对应的中序序列,根据中序和后序序列构造出二叉树,然后遍历这课二叉树看是否等于你排序的结果,也就是中序遍历的结果,这是最直接的求法,之前在前面的博客 剑指Offer-重建二叉树 中写过根据前序和中序,来构建二叉树,其实都是一样的性质,找到根节点就行了。

代码如下:


import java.util.ArrayList;
import java.util.List;

public class Solution {
    
	int lists[] = new int[1024];
	int z = 0 ;
	
	public  boolean VerifySquenceOfBST(int [] sequence) {
         
        if(sequence.length <= 0){
            return false;
        }
         
         int t[] = new int[sequence.length];
    	 System.arraycopy(sequence, 0, t, 0, sequence.length);
         for(int i = 0 ; i < sequence.length - 1; i ++){
             for(int j = 0 ; j < sequence.length - 1 - i ; j ++){
                 if(sequence[j] > sequence[j+1]){
                     int temp = sequence[j];
                     sequence[j] = sequence[j+1];
                     sequence[j+1] = temp;
                  }
             }
         }
         TreeNodes treeNode = Recusion(sequence,0,sequence.length-1,t,0,t.length-1);
//       System.out.println(treeNode);
         midForEach(treeNode);
         
         if(z != sequence.length ) {
        	 return false;
         }
         
         for(int i = 0 ; i < sequence.length ; i ++) {
        	 if(sequence[i] != lists[i]) {
        		 return false;
        	 }
//        	 System.out.println(sequence[i] + " : " + lists[i]);
         }
         return true;
    }
    
    public  TreeNodes Recusion(int []mid , int startMid , int endMid , int []aft, int startAft , int endAft){
            
    	TreeNodes treeNode = null;
        
        if(startMid > endMid || startAft > endAft){
            return treeNode;
        }
        
        for(int i = startMid ; i <= endMid ; i ++){
            if(mid[i] == aft[endAft]){
               treeNode = new TreeNodes(aft[endAft]);
               treeNode.left = Recusion(mid,startMid,i-1,aft,startAft,startAft+i-startMid-1);
               treeNode.right = Recusion(mid,i+1,endMid,aft,startAft+i-startMid,endAft-1); 
               break;
            }
        }
        return treeNode;
    }
    
    
    
    public  void midForEach(TreeNodes treeNode) {
    	if(treeNode != null) {
    		midForEach(treeNode.left);
//    		System.out.print(treeNode.val + "  ");
//    		lists.add(treeNode.val);
    		lists[z++] = treeNode.val;
    		midForEach(treeNode.right);
    	}
    }
    

}

class TreeNodes{
    int val;
    TreeNodes left;
    TreeNodes right;
    TreeNodes(int val){
        this.val = val;
    }
	@Override
	public String toString() {
		return "TreeNodes [val=" + val + ", left=" + left + ", right=" + right + "]";
	}
}

 剑指Offer的jdk说是1.8的,但是我在本地运行没有任何问题,提交上去就卡到一个数据过不了,测试都没问题,改正代码如上。



点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
7796
获赞与收藏
665

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消