题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路解析
-
首先需要了解树这个数据结构,这里双手奉上我写的:关于树的数据结构博客
-
这里先直接介绍:
后序遍历
-
题中的数并非是普通的二叉树,而是特殊的
二叉搜索树
,二叉搜索树的特点:
- (1)每个节点有一个唯一的key值,且所有结点互不相同;
- (2)左子树所有key值小于根的key值;
- (3)右子树所有key值大于根的key值;
- (4)左右子树都是二叉搜索树。
- 因此,这里可以考虑根据其特性进行解答。
- 下图是一个二叉搜索树:
后序遍历的序列是:1,2,4,3,6,9,8,7,5。
由后序遍历可知,根结点是5,由此来区分左右子树。
遍历数组:
左子树的数据为:1,2,4,3
右子树的数据为:6,9,8,7
然后在来区分左子树的各子树和叶子节点
3为根结点,1,2,4。为其子孙结点。其中1,2为左子树结点,4为右子树结点。
然后分1,2可知,1,2中,2为根节点,1为左叶子结点。
右子树同理。
在这个过程可以很方便的进行子树的分割,即最后一个结点为根结点。,然后在分割左右子树。
在代码过程中就递归的分割左右子树,同时在分割的时候进行判断,根结点应该大于所有左子树节点,小于所有有子树结点。
代码
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence){
//注意java中为空的情况可以是null也可以是[]
if(sequence.length==0||sequence==null) return false;
return isBST(sequence,0,sequence.length-1);
}
public boolean isBST(int[] sequence,int start,int end){
//当只有一个元素和根节点的时候,就直接返回正确
if(start>=end) return true;
//当多个节点的时候先将最后一个节点取出 因为后序遍历最后一个节点就是根节点
int root = sequence[end];
//切分左右节点的下标
int Index = start;
//找到根节点的位置
for(; Index<end;Index++){
if(sequence[Index]>root)
break;
}
//将根节点的元素与前面的进行对比
for(int i=start;i<Index;i++){
if(sequence[i]>=root){
return false;
}
}
//将根节点与后面的比较
for(int j= Index;j<end;j++){
if(sequence[j]<root)
return false;
}
//将左右子树送去进行递归
return isBST(sequence,start,Index-1)&&isBST(sequence,Index,end-1);
}
}