【算法】从前序与中序遍历序列构造二叉树

从前序与中序遍历序列构造二叉树

题目

image-20210424095007322

思路

二叉树相关的题目一般会马上想到递归

这里也一样,分别递归重建获得二叉树

重点:找到中序遍历中根节点位置的索引

重点api:

Arrays.copyOfRange(preorder, x , y);// copy的是一个左开右闭的区间 [x,y)

image-20210424095129897

代码

class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder == null || preorder.length == 0) return null;

        //1.获取到根节点value的值
        TreeNode root = new TreeNode(preorder[0]);
        int index = findIndex(preorder,inorder);
        //2.递归重构左子树buildTree(左子树的前序遍历数组,左子树的中序遍历数组);
        root.left = buildTree(
            Arrays.copyOfRange(preorder,1,index+1), 
            Arrays.copyOfRange(inorder,0,index) );

        //3.递归重构右子树 buildTree(右子树的前序遍历数组,右子树的中序遍历数组);
        root.right = buildTree(
            Arrays.copyOfRange(preorder,index + 1, preorder.length), 
            Arrays.copyOfRange(inorder,index +1,inorder.length));
        return root;
    }

    //这个方法用来找到根节点在中序遍历数组中的位置
    public int findIndex(int[] preorder, int[] inorder){
        int index = 0;
        for(int i = 0; i < inorder.length;i++){
            if(inorder[i] == preorder[0]){
                return i;
            }
        }
        return index;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值