106. 从中序与后序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树

class Solution {
    HashMap<Integer,Integer> in_map = new HashMap<>();
    int[] post;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        for(int i = 0;i < inorder.length;i++) in_map.put(inorder[i],i);
        post = postorder;
        TreeNode root = build(0, inorder.length - 1, 0, post.length - 1);
        return root;

    }
    /* 记录中序遍历和后序遍历的数组边界,函数内,后续的末尾为当前节点,他的左节点则在中序
    数组中对应元素的左边数组中,所以用hashmap找到中序数组节点的下标,node.left对中序数组左边进行查找,同时那些元素也在
    后序数组的最前面,因此后序数组的起点不变,长度与前序数组一样,node.right同理*/
    public TreeNode build(int in_left, int in_right,int po_left,int po_right){
        
        if(in_left > in_right || po_left > po_right) return null;
        int root = post[po_right];
        int in_root = in_map.get(root);
        TreeNode node = new TreeNode(root);
        node.left = build(in_left, in_root - 1, po_left, in_root - 1 - in_left + po_left);
        node.right = build(in_root + 1, in_right, in_root - in_left + po_left, po_right - 1);
        return node;
    }
}

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

前序中序也同理

class Solution {
    HashMap<Integer,Integer> in_map = new HashMap<>();
    int[] pre;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        for(int i = 0;i < inorder.length;i++) in_map.put(inorder[i],i);
        pre = preorder;
        TreeNode root = build(0, inorder.length - 1, 0, pre.length - 1);
        return root;

    }
    
    public TreeNode build(int in_left, int in_right,int pre_left,int pre_right){
        
        if(in_left > in_right || pre_left > pre_right) return null;
        int root = pre[pre_left];
        int in_root = in_map.get(root);
        TreeNode node = new TreeNode(root);
        node.left = build(in_left, in_root - 1, pre_left + 1, pre_right - in_right + in_root);
        node.right = build(in_root + 1, in_right, pre_right - in_right + in_root + 1, pre_right);
        return node;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值