题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
举例:
输入数组{5,7,6,8,9,11,10},返回true,因为其二叉排序如下;输入数组{7,4,6,5}则返回false。因为没有二叉排序树的后序遍历是7,4,6,5
思路:
1.将给定的数组中的元素,按照从后向前,创建二叉排序树
2.将创建好的二叉排序树,按照后序遍历存入集合
3.比较集合和给定数组中元素是否一一对应,一一对应则true
二叉搜索树:
- 中序遍历结果,一定是单单调递增的(假设没有相同值节点)
- 后序遍历结果postList:
1、根据postList,从后向前的元素,构造BST
2、后序遍历构造出来的BST,buildBSTPostList
3、postList.equals(buildBSTPostList)
public class VerifyPostOrderIsBst {
public static void main(String[] args) {
int[] postTraverse = {4,6,5,9,8};
boolean res = postTraverseArrIsBst(postTraverse);
System.out.println(res);
}
private static boolean postTraverseArrIsBst(int[] postArr) {
if (postArr == null || postArr.length == 0 || postArr.length == 1) {
return true;
}
// 1.postArr,从后向前,创建二叉搜索树
TreeNode root = new TreeNode(postArr[postArr.length - 1]);
buildBst(root, postArr);
// 2.后续遍历二叉搜索树
List<Integer> buildBSTPostList = new ArrayList<>();
postTraverse(buildBSTPostList, root);
// 3.比较两个后续集合是否相等
List<Integer> postList = Arrays.stream(postArr).boxed().collect(Collectors.toList());
return buildBSTPostList.equals(postList);
}
private static void postTraverse(List<Integer> list, TreeNode root) {
if (root == null) {
return;
}
postTraverse(list, root.left);
postTraverse(list, root.right);
list.add(root.val);
}
private static void buildBst(TreeNode root, int[] arr) {
for (int i = arr.length - 2; i >= 0; i--) {
int val = arr[i];
build(root, val);
}
}
private static void build(TreeNode root, int val) {
if (root == null) {
return;
}
if (root.val > val) {
if (root.left == null) {
root.left = new TreeNode(val);
} else {
build(root.left, val);
}
} else {
if (root.right == null) {
root.right = new TreeNode(val);
} else {
build(root.right, val);
}
}
}
}