题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树(二叉排序树)的后序遍历的结果。如果是则输出Yes,否则输出No。
假设输入的数组的任意两个数字都互不相同。
解题思路
后序遍历:左——右——根 ,且 左 < 根 < 右
突破口:后序遍历到的最后一个结点就是根节点,之前遍历到的结点小于根结点则为左子树,大于根节点则为右子树
思路:
1、确定root;
2、遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;
3、遍历右子树,若发现有小于root的值,则直接返回false;
4、分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。
具体代码
• C++
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(!sequence.size())
return false;
return judge(sequence,0,sequence.size()-1);
}
// 判断是否为二叉排序树
// start表示数组起始位,end表示数组终点位
bool judge(vector<int> &sequence, int start, int end){
if(start >= end)
return true;
int pivot; //第一个大于根节点的位置
for(pivot = start; sequence[pivot] < sequence[end]; pivot ++); //查找分界点
for(int i = pivot; i<=end; i++)
// 若该分界点的右边有小于根结点的数,false
if(sequence[i] < sequence[end])
return false;
return judge(sequence,start,pivot-1) && judge(sequence,pivot,end-1);
}
};
• Java
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length <= 0)
return false;
return judge(sequence,0,sequence.length-1);
}
public boolean judge(int [] sequence,int start,int end){
if(start>=end)
return true;
int pivot;
for(pivot = start; sequence[pivot] < sequence[end]; pivot++); //查找分界点
for(int i = pivot; i <= end; i++)
if(sequence[i] < sequence[end])
return false;
return judge(sequence,start,pivot-1) && judge(sequence,pivot,end-1);
}
}