树的构造 II leetcode

Construct Binary Tree from Preorder and Inorder Traversal

递归解法

思路

     1       
    / \   
   2   3   
  / \ / \   
 4  5 6  7

对于上图的树来说,
         index: 0 1 2 3 4 5 6
     先序遍历为: 1 2 4 5 3 6 7 
     中序遍历为: 4 2 5 1 6 3 7

1. 先序遍历的第一个节点为根节点。
2. 中序遍历中根节点是左子树右子树的分割点。

所以这道题可以用递归的方法解决。
通过先序遍历找到第一个点作为根节点,在中序遍历中找到根节点并记录index。此处用hashmap来存储, key为中序遍历节点值 value为index
因为中序遍历中根节点左边为左子树,所以可以记录左子树的长度并在先序遍历中依据这个长度找到左子树的区间,用同样方法可以找到右子树的区间。
递归的建立好左子树和右子树就好。

复杂度

时间O(n) 空间用了一个map 为O(n)

代码

public TreeNode buildTree(int[] preorder, int[] inorder) {
    if (preorder == null || inorder == null || preorder.length == 0 || inorder.length == 0 || preorder.length != inorder.length) {
        return null;
    }
    int len = preorder.length;
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (int i = 0; i < len; i++) {
        map.put(inorder[i], i);
    }
    return helper(preorder, 0 , len - 1, inorder, 0, len - 1, map);
}
public TreeNode helper(int[] preorder, int pstart, int pend, int[] inorder, int istart, int iend, HashMap<Integer, Integer> map) {
    if (pstart > pend || istart > iend) {
        return null;
    }
    TreeNode root = new TreeNode(preorder[pstart]);
    int index = map.get(root.val);
    root.left = helper(preorder, pstart + 1, pstart + index - istart, inorder, istart, index - 1, map);
    root.right = helper(preorder, pstart + index - istart + 1, pend, inorder, index + 1, iend, map);
    return root;
}

Construct Binary Tree from Inorder and Postorder Traversal

递归解法

复杂度

时间O(n) 空间用了一个map 为O(n)

代码

public TreeNode buildTree(int[] inorder, int[] postorder) {
    int len = inorder.length;
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (int i = 0; i < len; i++) {
        map.put(inorder[i], i);
    }
    return helper(inorder, 0, len - 1, postorder, 0 , len - 1, map);
}
public TreeNode helper(int[] inorder, int istart, int iend, int[] postorder, int pstart, int pend, HashMap<Integer, Integer> map) {
    if (istart > iend || pstart > pend) {
        return null;
    }
    TreeNode root = new TreeNode(postorder[pend]);
    int index = map.get(root.val);
    root.left = helper(inorder, istart, index - 1, postorder, pstart, pstart + index - istart - 1, map);
    root.right = helper(inorder, index + 1, iend, postorder, pstart + index - istart, pend - 1, map);
    return root;
}       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值