二叉搜索树的后序遍历序列
题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
知识点:
二叉搜索树
解题思路:
首先题目说二叉搜索树,所以要搞清楚二叉搜索树的概念,二叉搜索树就是我们所说的二叉排序树,二叉排序树也就是满足以下性质的二叉树:若它的左子树不空,则左子树上所有关键字的值均小于根关键字的值;若它的右子树不空,则右子树上所有关键字的值均大于根关键字的值。左右子树又各是一棵二叉排序树。
根据二叉排序树的概念可知,后序遍历序列最后一个元素是该二叉排序树的根节点,二叉排序树的左子树始终小于根节点,右子树是始终大于根节点。于是根节点之前的元素可以分为两部分,左子树和右子树。同理左子树和右子树的结构也做同样处理,即一个递归的过程。类似于之前写过的重建二叉树的过程。
具体代码:
import java.util.Arrays;
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
int len=sequence.length;
if(sequence==null||len<=0)
return false;
int root=sequence[len-1];
int i=0;
int j=0;
//确定左子树部分的节点
for(i=0;i<len-1;i++) {
if(sequence[i]>root)
break;
}
//左子树的根节点为i-1
//确定右子树部分的节点
System.out.println(i);
for(j=i;j<len-1;j++) {
if(sequence[j]<root)
return false;
}
//判断左子树是不是二叉搜索树
boolean left=true;
int[] leftsequence=Arrays.copyOfRange(sequence, 0, i);
if(i>0)
left=VerifySquenceOfBST(leftsequence);
//判断右子树是不是二叉搜索树
boolean right=true;
int[] rightsequence=Arrays.copyOfRange(sequence, i, len-1);
if(i<len-1)
right=VerifySquenceOfBST(rightsequence);
return (left&&right);
}
}
注意点:
确定左右子树的时候确定下标时要注意数字的正确,这里在确定左右子树时,用了Arrays.copyOfRange函数来截取生成新的子数组;并没有提醒运行内存和时间超过限制。但是个人认为递归运行一直生成数组,会占用额外的空间。可以另外写一函数,根据长度来确定左右子树。