重建二叉树(java)

给定一棵二叉树的前序,和中序的遍历数组(不含重复数字),重构这棵二叉树,

 

/**
     * 方法
     * @param pre
     * @param mid
     * @return
     */
    public Node method1(int[] pre, int[] mid) {
        if (pre == null || mid == null) {
            return null;
        }

        return core(pre, 0, pre.length - 1, mid, 0, mid.length - 1);
    }

    /**
     * 核心代码
     * @param pre
     * @param ps
     * @param pe
     * @param mid
     * @param ms
     * @param me
     * @return
     */
    public Node core(int[] pre, int ps, int pe, int[] mid, int ms, int me) {
        if (ps > pe || ms > me) {
            return null;
        }

        //前序遍历的数组的第一位是根节点
        Node root = new Node(pre[ps]);

        //找到根节点,根节点前后分成两部分,分别是左右子树
        for (int i = ms; i <= me; i++) {
            if (mid[i] == pre[ps]) {
                //i - ms 是子树的节点个数
                root.left = core(pre, ps + 1, ps + i - ms, mid, ms, i - 1);


                root.right = core(pre, i - ms + 1 + ps, pe, mid, i + 1, me);
            }

        }
        return root;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值