LeeCode105从前序与中序遍历中遍历二叉树(Java)(递归)

题目链接:LeeCode105从前序与中序遍历中遍历二叉树
题目描述:在这里插入图片描述
这个题真的是折磨死我,因为对前序中序概念理解的不是太好,脑子里面没有这种概念,憋了我两天,最后是又看视频又看题解终于想明白了。
前序遍历是 根->左序列->右序列
中序遍历是 左序列->根->右序列
做法就是相当于遍历一遍前序,当 前序序列 下标所在点在 中序序列 中前面没有其他点的时候这个前序序列点后面的就是他的右子树序列
每次取前序序列的头,就是当前遍历的根节点,再根据根节点分出左右序列

class Solution {
    public static TreeNode buildTree(int[] preorder, int[] inorder) {
        Map<Integer,Integer> map=new HashMap<>();
        for (int i = 0; i < inorder.length; i++) {
        	//储存中序序列中每一个数据对应的下标
            map.put(inorder[i],i);
        }
        return mytree(preorder,0,preorder.length,inorder,0,inorder.length,map);
    }
    public static TreeNode mytree(int[] preorder,int pre_start,int pre_end,int[] inorder,int in_start,int in_end,Map<Integer,Integer> map){
        //pre_start每次都是当前序列开始下标加1,pre_end是中序根节点前面的长度+pre_start,所以就是当中序中左或右为空返回
        if(pre_start>=pre_end) return null;
        //获取根节点下标
        Integer integer = map.get(preorder[pre_start]);
        //把当前的节点当作根节点
        TreeNode root=new TreeNode(preorder[pre_start]);
        //中序中根节点减开始位置即下一个序列长度
        int len=integer-in_start;
        root.left=mytree(preorder, pre_start+1, pre_start+len+1, inorder, in_start, integer, map);
        root.right=mytree(preorder, pre_start+len+1, pre_end, inorder, integer+1, in_end, map);
        return root;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值