剑指offer: 二叉搜索树的后序遍历序列

xiaoxiao2021-02-28  99

题目描述

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

方法1:递归统计个数

思路:二叉搜索树的后续遍历对应的根结点为该数组的最后一个元素,记为temp。满足二叉搜索树条件:左子树所有节点值<temp,而右子树所有节点值>temp。我们用list1和list2分别存左子树和右子树节点,递归左右子树。满足二叉搜索树条件:list1.size()+list2.size()=数组长度减1.否则则返回false. 【运行时间:14ms  占用内存:8280k】 import java.util.*; public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { ArrayList<Integer> list1=new ArrayList<Integer>(); ArrayList<Integer> list2=new ArrayList<Integer>(); if(sequence==null||sequence.length==0) return false; if(sequence.length==1) return true; int temp=sequence[sequence.length-1]; Boolean flag=false;//用flag标记是否访问过 int size=sequence.length-1; for(int i=0;i<size;i++){ if(sequence[i]<temp&&(!flag)){ list1.add(sequence[i]); }else if(sequence[i]>temp){ list2.add(sequence[i]); flag=true; } } //判断元素数目是否一样 if(size!=(list1.size()+list2.size())){ return false; } //左子树 int left[]=new int[list1.size()]; for(int i=0;i<list1.size();i++){ left[i]=list1.get(i); } //右子树 int right[]=new int[list2.size()]; for(int i=0;i<list2.size();i++){ right[i]=list2.get(i); } VerifySquenceOfBST(left);//递归左子树 VerifySquenceOfBST(right);//递归右子树 return true; } }

方法2:递归

参考牛客网网友回答,思路和我这差不多,但是比我写的简洁 public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if(sequence.length==0) return false; return isBST(sequence,0,sequence.length-1); } public boolean isBST(int []sequence,int start,int end){ if(start>=end) return true; //i为全局变量,记录第一个大于根结点的元素 int i=start; for(;i<end;i++){ if(sequence[i]>sequence[end]) break; } //右子树判断 for(int j=i;j<end;j++){ //如果右子树中出现比根结点小的,返回false if(sequence[j]<sequence[end]) return false; } return isBST(sequence,start,i-1)&&isBST(sequence,i,end-1); } }

方法3:非递归的解法

if(sequence==null||sequence.length==0) return false; int len=sequence.length; int i=0; while(len!=0){ len--; while((i<=len)&&(sequence[i++]<sequence[len])); while((i<=len)&&(sequence[i++]>sequence[len])); if(i<len) return false; i=0; } return true;

转载请注明原文地址: https://www.6miu.com/read-55679.html

最新回复(0)