博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer——二叉搜索树的后序遍历序列
阅读量:5155 次
发布时间:2019-06-13

本文共 2652 字,大约阅读时间需要 8 分钟。

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

这里遇到的问题就是,传递的子数组怎么递归的传递下去,(Java基础不好,所以很多接口与方法都不熟悉)

看过答案之后,用的是Arrays的方法Arrays.copyOfRange(arrays, 1, 9);很神奇

还有就是左右两边子树判断的情况是不一样的,所以自己想的就很尴尬,不知道怎么处理

看了别人的答案之后,很神奇,先处理左边子树,在处理右边子树,然后再递归的进行左右子树内部的处理。

import java.util.Arrays;public class Solution {    public boolean VerifySquenceOfBST(int [] sequence) {        if(sequence.length == 0) return false;        int len = sequence.length;        int root = sequence[len - 1];        int i = 0;        for(; i < len - 1; i++){            if(root < sequence[i]) break;        }        int j = i;        for(; j < len - 1; j++){            if(root > sequence[j]) return false;        }        boolean leftIsBST = true;        if(i > 0){            leftIsBST = VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, i));        }        boolean rightIsBST = true;        if(j < len - 1){            rightIsBST = VerifySquenceOfBST(Arrays.copyOfRange(sequence, i, j));        }        return leftIsBST && rightIsBST;    }}

  

 

下面这一种方式不是很理解

看的别人的 i 定义为一个右边子树的开始结点,但是想不明白为什么要遍历一遍数组,来找出root>sequence[j]的个数来作为i

 

import java.util.Arrays;public class Solution {    public boolean VerifySquenceOfBST(int [] sequence) {        if(sequence.length == 0) return false;        int len = sequence.length;        int root = sequence[len - 1];        int i = 0;        for(int j = 0; j < len - 1; j++){            if(root > sequence[j]) i++;        }        if(i == 0){            VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, len - 1));        }else{            for(int j = i; j < len - 1; j++){                if(root > sequence[j]) return false;            }            VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, i));            VerifySquenceOfBST(Arrays.copyOfRange(sequence, i, len - 1));        }        return true;    }}

  

 重新写了一个不传递数组,直接传子数组的位置大小的

public class Solution {    public boolean VerifySquenceOfBST(int [] sequence) {        if(sequence.length == 0) return false;        int len = sequence.length;        return postTran(sequence, len - 1, 0, len - 2 );    }        public boolean postTran(int[] sequence, int len, int low, int high){        if(len <= 0 || low >= high) return true;        int index = low;        while(index < len){            if(sequence[index] > sequence[len]) break;            index++;        }        int flag = index;        while(index < len){            if(sequence[index] < sequence[len]) return false;            index++;        }        return postTran(sequence, flag - 1, low, flag - 2)             && postTran(sequence, high-1, flag, high-2);    }}

  

转载于:https://www.cnblogs.com/SkyeAngel/p/8572331.html

你可能感兴趣的文章
squid,nginx,lighttpd反向代理的区别
查看>>
利用 Apache 为个人用户创建 web 站点及其报错处理
查看>>
java编程思想第四版第十八章总结
查看>>
查询分页
查看>>
C# 读取excel
查看>>
关于单行和多行文本溢出显示省略号的解决方案
查看>>
前端开发工具介绍----合成雪碧图工具(css sprite)
查看>>
Linux高级权限管理
查看>>
[转]Formatting the detail section to display multiple columns (水晶报表 rpt 一页多列)
查看>>
[转]小程序web-view组件
查看>>
[转]调整 VirtualBox 虚拟机的磁盘大小
查看>>
学习总结
查看>>
pip安装其他包报错
查看>>
Redis面试题及分布式集群
查看>>
发短信的简单实现——C#版
查看>>
(算法)构造最大数
查看>>
命令行开发、编译、打包Android应用程序
查看>>
Java实现HTML页面转PDF解决方案(转)
查看>>
eclipse PHP开发环境配置
查看>>
Java 反射 使用总结
查看>>