题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true。否则返回 false。假设输入的数组的任意两个数字都互不相同。
解题思路
在后序遍历得到的序列中, 最后一个数字是树的根结点的值。数组中前面的数字可以分为两部分: 第一部分是左子树结点的值,它们都比根结点的值小: 第二部分是右子树结点的值,它们都比根结点的值大。
这就是规律啦,也是一个递归的方式实现。
测试用例
- 功能测试(输入的后序遍历的序列对应一棵二叉树,包括完全二叉树,所有结点都没有左/右子树的二叉树、只有一个结点的二叉树;输入的后序遍历的序列没有对应一棵二叉树)
- 特殊输入测试(指向后序遍历的是null)
代码
public class VerifySquenceOfBST {
public static boolean verifySquenceOfBST(int[] sq){
if(sq==null||sq.length<=0){
return false;
}
return verifySquenceOfBST(sq,0,sq.length-1);
}
public static boolean verifySquenceOfBST(int[] sq,int low,int high){
if(low>=high){
return true;
}
int index=low;
while(index<high-1&&sq[index]<sq[high]){
index++;
}
int right=index;
while(index<high-1&&sq[index]>sq[high]){
index++;
}
if(index!=high-1){
return false;
}
index=right;
return verifySquenceOfBST(sq,low,index-1)&&verifySquenceOfBST(sq,index,high-1);
}
public static void main(String[] args) {
// 10
// / \
// 6 14
// /\ /\
// 4 8 12 16
int[] data = {4, 8, 6, 12, 16, 14, 10};
System.out.println("true: " + verifySquenceOfBST(data));
// 5
// / \
// 4 7
// /
// 6
int[] data2 = {4, 6, 7, 5};
System.out.println("true: " + verifySquenceOfBST(data2));
// 5
// /
// 4
// /
// 3
// /
// 2
// /
// 1
int[] data3 = {1, 2, 3, 4, 5};
System.out.println("true: " + verifySquenceOfBST(data3));
// 1
// \
// 2
// \
// 3
// \
// 4
// \
// 5
int[] data4 = {5, 4, 3, 2, 1};
System.out.println("true: " + verifySquenceOfBST(data4));
// 树中只有1个结点
int[] data5 = {5};
System.out.println("true: " + verifySquenceOfBST(data5));
int[] data6 = {7, 4, 6, 5};
System.out.println("false: " + verifySquenceOfBST(data6));
int[] data7 = {4, 6, 12, 8, 16, 14, 10};
System.out.println("false: " + verifySquenceOfBST(data7));
}
}