【剑指Offer系列】33-二叉搜索树的后序遍历序列(二叉搜索树的后序遍历特点postList.equals(buildBSTPostList))

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回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);
            }
        }
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值