1题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
2.1后序遍历
后序遍历:左子树 —> 右子树 —> 根结点,上面二叉搜索树输出{5,7,6,9,11,10,8}。
2.2解题思路
对于后续遍历序列,序列的最后一个值一定是树的根结点,而由二叉搜索树的性质:左小右大,我们可以从头开始遍历,当遍历到某个值比根结点大时停止,记为flag,此时flag之前的所有数值都是二叉搜索树的左子树的结点,flag以及flag之后的所有数都是二叉搜索树的右子树的结点。这是由二叉搜索树以及后序遍历共同决定的。这显然是典型的递归解法。
3.编程实现(Java):
public class VerifySquenceOfBST_49 {
public boolean VerifySquenceOfBST(int[] sequence) {
if (sequence == null || sequence.length == 0)
return false;
return VerifySquenceOfBST(sequence, 0, sequence.length - 1);
}
public boolean VerifySquenceOfBST(int[] sequence, int begin, int end) {
//结束条件
if (end <= begin)
return true;
int i = begin;
//end为根节点,找左右子树的分界
for (; i < end; i++) {
if (sequence[i] > sequence[end])
break;
}
for (int j = i + 1; j < end; j++) {
if (sequence[j] < sequence[end])
return false;
}
return VerifySquenceOfBST(sequence, begin, i - 1)
&& VerifySquenceOfBST(sequence, i, end - 1);
}
}