题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出true,否则输出false。假设输入的数组的任意两个数字都互不相同。
练习地址
- 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树:
- 左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 左、右子树也分别为二叉排序树。
实现
- lc
// 5
// / \
// 2 6
// / \
// 1 3
//输入: [1,6,3,2,5]
//输出: false
//输入: [1,3,2,6,5]
//输出: true
public boolean verifyPostorder(int[] postorder) {
return core(postorder, 0, postorder.length - 1);
}
public boolean core(int[] pos, int start, int end) {
if (start >= end) return true;
int i = start;
while (pos[i] < pos[end]) {
i++;
}
int j = i;
while (pos[i] > pos[end]) {
i++;
}
boolean left = core(pos, start, j - 1);
boolean right = core(pos, j, end - 1);
return (i == end) && left && right;
}
- jz
public class C33_tree_SquenceBST {
public static boolean verifySquenceOfBST(int[] arr) {
if (arr == null || arr.length <= 0)
return false;
return BSTCore(arr, 0, arr.length - 1);
}
static boolean BSTCore(int[] arr, int start, int end) {
int root = arr[end];
// 左子树节点的值小于根节点
int i = start;
for (; i < end; i++) {
if (arr[i] > root) {
break;
}
}
// 右子树节点的值大于根节点的值
int j = i;
for (; j < end; j++) {
if (arr[j] < root) {
return false;
}
}
// 判断左子树是不是二叉搜索树
boolean left = true;
if (i > start) {
left = BSTCore(arr, start, i - 1);
}
// 判断右子树是不是二叉搜索树
boolean right = true;
if (j < end) {
right = BSTCore(arr, i, j);
}
return (left && right);
}
}
Test
public static void main(String[] args) {
int[] arr = {5, 7, 6, 9, 11, 10, 8}; // true
int[] arr1 = {7, 4, 6, 5}; // false
System.out.println(verifySquenceOfBST(arr));
System.out.println(verifySquenceOfBST(arr1));
}