您的位置:首页 > Web前端

[剑指Offer]二叉搜索树的后续遍历序列

2014-06-04 10:27 387 查看

题目描述

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

解题思路

二叉搜索树的定义:
二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

如下图:



通过定义我们知道,在后序遍历得到的二叉搜索树序列中,最后一个数字时数的根节点的值。数组中前面的数字分为两部分:第一部分是左子树的节点的值,它们均比根节点的值小;第二部分是右子树的节点的值,它们均比根节点的值大。
因此,我们可以通过递归来解决本题。

代码

public static boolean verifySquenceOfBST(int[] sequence,int start,int end) {
if(sequence == null || sequence.length==0 || end < start){
return false;
}

int root = sequence[end];//end = sequence.length - 1;
int i,j;
boolean isLeftOfBST = true,isRightOfBST = true;

//在二叉搜索树中左子树的节点小于根节点
for(i = start;i < end;i++){
if(sequence[i] > root){
break;
}
}

//在二叉搜索树中右子树的节点大于根节点
for(j = i;j < end;j++){
if(sequence[j] < root){
return false;
}
}

//递归判断二叉搜索树中左子树是否是二叉搜索树
if(i > start){
isLeftOfBST = verifySquenceOfBST(sequence,start,i - 1);
}

//递归判断二叉搜索数中右是否是二叉搜索树
if(i < end){
isRightOfBST = verifySquenceOfBST(sequence,i,end-1);
}

return isLeftOfBST&&isRightOfBST;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: