题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
- 输入的数组不能为空,并且有数据。
- 先找到右子树的开始位置,然后分别进行左右子树递归处理。
代码:
package 二叉搜索树的后序遍历序列24;
import java.util.*;
/**
* 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
* 如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
* @author Administrator
*
*/
public class Demo {
public static boolean VerifySquenceOfBST(int[] sequence) {
// 输入的数组不能为空,并且有数据
if (sequence == null && sequence.length <= 0) {
return false;
}
// 后序遍历中,最后一个数字是树的根结点。root :根结点
int rstart = 0;
int length = sequence.length;
// 在二叉搜索树中左子树的结点小于根节点。计算左子树结点数量
for (int i = 0; i < length - 1; i++) {
if (sequence[i] < sequence[length - 1]) {
rstart++;
}
}
// 若 rstart 为 0,则不存在左子树。全部元素为右子树结点,重新判断
if (rstart == 0) {
VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, length - 1));
} else {
// 若 rstart 不为 0 ,遍历右子树,若有元素小于根节点,则不满足右子树所有结点大于根节点这一条件
for (int i = rstart; i < length - 1; i++) {
if (sequence[i] <= sequence[length - 1]) {
return false;
}
}
// 判断左子树是不是二叉搜索树
VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, length - 1));
// 判断右子树是不是二叉搜索树
VerifySquenceOfBST(Arrays.copyOfRange(sequence, rstart, length - 1));
}
return true;
}
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));
}
}