题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入的数组的任意两个数字都互不相同。
![](https://img.haomeiwen.com/i10004286/dce0edbc5f41c98f.png)
解题思路
性质:
- 二叉排序树的性质:左子树上所有节点的值均小于它的根节点;右子树上所有节点的值均大于它的根节点。
- 二叉排序树后序遍历的性质:序列最后一个数字是根节点,序列剩余部分分成两部分,前一部分是左子树,后一部分是右子树。
举例:
- 判断序列{5,7,6,9,11,10,8}是否是二叉排序树的后序遍历。其中,8是根节点,{5,7,6}比8小是左子树,{9,11,10}比8大是右子树。
- 判断{5,7,6}是否是二叉排序树,其中6是根节点,5比6小是左子树,7比6大是右子树。
- 判断{9,11,10}是否是二叉排序树,其中10是根节点,9比10小是左子树,11比10大是右子树。
代码实现
public boolean VerifySquenceOfBST(int[] sequence) {
/*
* 判空条件必须是两个:
* |--sequence == null为true,不会执行sequence.length == 0
* |--sequence == null为false,执行sequence.length == 0不会报空指针异常
*/
if (sequence == null || sequence.length == 0)
return false;
int N = sequence.length;
return VerifySquenceOfBST(sequence, 0, N - 1);
}
private boolean VerifySquenceOfBST(int[] sequence, int left, int right) {
if (left >= right)
return true;
int root = sequence[right];
//i记录比root(根节点)大的第一个元素的索引
int i = left;
for (; i < right - 1; i++) {
if (sequence[i] > root)
break;
}
//如果右子树有元素小于root,返回false;
for (int j = i; j < right - 1; j++) {
if (sequence[j] < root)
return false;
}
//否则递归求解左子树和右子树
return VerifySquenceOfBST(sequence, left, i - 1) && VerifySquenceOfBST(sequence, i, right - 1);
}
网友评论