剑指offer--二叉搜索树的后序遍历序列
来源:互联网 发布:oppo应用分身软件 编辑:程序博客网 时间:2024/06/06 16:01
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同
思路:
二叉搜索树的性质:根节点大于左子树所有元素,小于右子数的所有元素。后序遍历的话,最后一个元素就为根节点root。若数组为null或者长度为0,则返回true,若数组基本有序(即所有元素已经是升序或降序),返回true,否则,找到划分左右子树的数组元素下标(sequence[i] < root && sequence[i+1] > root),之后判断下标属于[0,i]的子序列是否全小于root,[i,len-2]的子序列是否全大于root。
AC代码:
import java.util.Arrays;public class Solution { public boolean VerifyLeftTree(int[] leftsequence , int root){ boolean flag = true; for ( int i = 0 ; i < leftsequence.length ; i++){ if ( leftsequence[i] >= root){ flag = false; break; } } return flag; } public boolean VerifyRightTree(int[] rightsequence , int root){ boolean flag = true; for ( int i = 0 ; i < rightsequence.length ; i++){ if ( rightsequence[i] <= root){ flag = false; break; } } return flag; } //判断sequence是否已经有序 public boolean IsOrder(int [] sequence){ //判断是否已经是升序 int[] tmp = Arrays.copyOfRange(sequence, 0, sequence.length); Arrays.sort(tmp); boolean flag1 = true; for(int i = 0 ; i < sequence.length ; i++){ if ( sequence[i] != tmp[i]){ flag1 = false; break; } } //判断是否已经是降序 int cnt = 0; boolean flag2 = true; for ( int i = tmp.length-1 ; i >= 0 ; i--){ if ( sequence[cnt++] != tmp[i]){ flag2 = false; break; } } boolean flag = flag1 || flag2; return flag; } public boolean VerifySquenceOfBST(int [] sequence) { int partition = 0; int len = sequence.length; if ( sequence == null || len == 0){ return false; } int root = sequence[len-1]; if ( IsOrder(sequence)){ return true; } for ( int i = 0 ; i < len-1 ; i++){ if (sequence[i] < root && sequence[i+1] > root){ partition = i; break; } } int[] left = Arrays.copyOfRange(sequence, 0, partition+1); int[] right = Arrays.copyOfRange(sequence, partition+1, len-1); for ( int i = 0 ; i < left.length ; i++){ System.out.print(left[i]+" "); } System.out.println(); for ( int i = 0 ; i < right.length ; i++){ System.out.print(right[i]+" "); } boolean leftflag = VerifyLeftTree(left,root); boolean rightflag = VerifyRightTree(right,root); boolean flag = leftflag & rightflag; return flag; }}
1 0
- 剑指offer:二叉搜索树的后序遍历序列
- 【剑指offer】二叉搜索树的后序遍历序列
- 剑指offer--二叉搜索树的后序遍历序列
- 剑指Offer-->二叉搜索树的后序遍历序列
- 《剑指offer》二叉搜索树的后序遍历序列
- 【剑指Offer】二叉搜索树的后序遍历序列
- 剑指offer--二叉搜索树的后序遍历序列
- 剑指 offer:二叉搜索树的后序遍历序列
- 剑指offer:二叉搜索树的后序遍历序列
- 【剑指offer】二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列||剑指offer
- 剑指offer-二叉搜索树的后序遍历序列
- 剑指offer 二叉搜索树的后序遍历序列
- 剑指offer 二叉搜索树的后序遍历序列
- 剑指offer:二叉搜索树的后序遍历序列
- [剑指offer]二叉搜索树的后序遍历序列
- 《剑指offer》-二叉搜索树的后序遍历序列
- 【剑指offer】二叉搜索树的后序遍历序列
- 1.12 关系的完整性
- Vi编辑器的常用命令
- GetLastError函数
- [AC自动机 + DP] BZOJ1030: [JSOI2007]文本生成器
- [Python]浅拷贝与深拷贝
- 剑指offer--二叉搜索树的后序遍历序列
- 【mark】QQ 探测,爬取网页内容
- [数学期望]BZOJ 1415
- adc驱动实例(工作队列+等待队列+设备树+属性文件)
- Java入门学习-学会try/catch/throw的用法。做出一个计算器除法功能,除以0时程序必须给出提示。
- 字符串匹配
- 大数据时代的小数字感:数据再有价值,别人听不懂照样没用
- Unity3DGame学习笔记(6):粒子系统
- 集合框架-统计字符串中每个字符出现的次数案例图解