题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。
假设输入的数组的任意两个数字都互不相同。
例如输入数组 {5,7,6,9,11,10,8} ,则返回true,因为这个整数序列是下图二叉搜索树的后序遍历结果。
如果输入的数组是 {7,4,6,5},由于没有哪棵二叉搜索树的后序遍历结果是这个序列,因此返回false。
解题思路
代码
public class VerifySequenceOfBST {
public static boolean verifySequenceOfBSE(int[] sequence) {
if (sequence == null || sequence.length == 0) {
return false;
}
return verifySequenceOfBSE(sequence, 0, sequence.length-1);
}
public static boolean verifySequenceOfBSE(int[] sequence, int start, int end) {
int root = sequence[end];
int i = start;
while (i < end && sequence[i] < root) {
i++;
}
int j = i;
while (j < end) {
if (sequence[j] < root) {
return false;
}
j++;
}
boolean left = true;
if (i > 0) {
left = verifySequenceOfBSE(sequence, 0, i-1);
}
boolean right = true;
if (i < end) {
right = verifySequenceOfBSE(sequence, i, end - 1);
}
return (left && right);
}
public static void main(String[] args) {
int[] sequence = {5,7,6,9,11,10,8};
System.out.println(verifySequenceOfBSE(sequence));
int[] sequence1 = {7,4,6,5};
System.out.println(verifySequenceOfBSE(sequence1));
int[] sequence2 = {2,1};
System.out.println(verifySequenceOfBSE(sequence2));
int[] sequence3 = {2};
System.out.println(verifySequenceOfBSE(sequence3));
}
}
补充
-
二叉搜索树 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值 -
举一反三 如果面试题要求处理一棵二叉树的遍历序列,则可以找到二叉树的根节点,再基于根节点把整棵树的遍历序列拆分成左子序列和右子序列,接下来再递归地处理这两个子序列。
来自:
《剑指Offer》 Coding-Interviews/二叉搜索树的后序遍历序列.md at master · todorex/Coding-Interviews
|