标签:
描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同
二叉搜索树也叫二叉排序树,即左孩子的值全都小于根节点,右孩子的值全都大于根节点,根节点的左右孩子也是二叉搜索树。
给定如下一颗二叉搜索树:
其后序遍历为:2 9 5 16 17 15 19 18 12。
现在假设给定了某个后序遍历数组为:2 9 5 16 17 15 19 18 12
我们从根节点出发,即节点12,如果此数组是某个二叉排序树后续遍历的结果,也就说数组中的数据必然可以分成两部分:一部分是全小于12,一部分全大于12,我们先从数组找第一个大于12的数即16,那么可以该数组可以被分成两部分
第一部分:2 9 5
第二部分:16 17 15 19 18
要使根节点12满足二叉排序树的定义,那么必定有第一部分全部小于12,第二部分全部大于12。
此时第一部分和第二部分又变成了根节点12的左右孩子要满足二叉搜索树的情况,第一部分表示的子树的根节点为5,第二部分表示的子树的根节点为18,即我们现在要判断根节点为5和根节点为18的两棵树是否都满足二叉排序树的定义,这是一个递归的过程。
class ListNode{
int val;
ListNode next=null;
ListNode(int val) {
this.val=val;
}
}
public int findPosition(int[] sequence,int start,int end,int val){
//从sequence的start-end找到第一个大于val的位置
int i=start;
for(;i<=end;i++){
if(sequence[i]>val)
break;
}
return i;
}
public boolean isSquenceOfBST(int[] sequence,int start,int end){
if(end<0||start>=sequence.length)
return true;
int val=sequence[end];
int position=0;
if(start<end){
//将数组在position为位置分成两部分,左边一部分必然全小于val,右边一部分必然要全大于val
position=findPosition(sequence, start, end-1, val);
for(int i=position;i<=end;i++){
if(sequence[i]<val) //如果出现右边部分有数字小于val则不符合二叉搜索树的定义
return false;
}
}else{
return true;
}
//判断左右子树是否符合二叉搜索树的定义
return isSquenceOfBST(sequence,start,position-1)&&
isSquenceOfBST(sequence, position, end-1);
}
/**
* 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果
* */
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length<=0)
return false;
return isSquenceOfBST(sequence, 0, sequence.length-1);
}
标签:
原文地址:http://blog.csdn.net/zlp1992/article/details/51353481