105. Construct Binary Tree from Preorder and Inorder Traversal | 已知前序和中序复原树
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] pre, int[] in) {
if(pre.length==0 || in.length==0 || pre.length!=in.length) return null;
return helper(pre, 0, pre.length-1, in, 0, in.length-1);
}
private TreeNode helper(int[] pre, int ps, int pe, int[] in, int is, int ie) {
if(ps>pe || is>ie) return null;
TreeNode root = new TreeNode(pre[ps]);
for(int i=is; i<=ie; i++) {
if(pre[ps]==in[i]) {
root.left = helper(pre, ps+1, pe+i-is, in, is, i-1);
root.right = helper(pre, ps+1+i-is, pe, in, i+1, ie);
break;
}
}
return root;
}
}
优化:
用HashMap存储inorder的数组,时间复杂度上减少了每次循环查找pre[ps]在中序中的位置
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//preorder : root,left,right
//inorder : left,root,right
public TreeNode buildTree(int[] pre, int[] in) {
if(pre.length==0 || in.length==0 || pre.length!=in.length) return null;
HashMap<Integer,Integer> mapin = new HashMap<>();
for(int i=0; i<in.length; i++) mapin.put(in[i],i);
return helper(pre, 0, pre.length-1, mapin, 0, in.length-1);
}
private TreeNode helper(int[] pre, int ps, int pe, HashMap<Integer,Integer> mapin, int is, int ie) {
if(ps>pe || is>ie) return null;
TreeNode root = new TreeNode(pre[ps]);
int i = mapin.get(pre[ps]);
root.left = helper(pre, ps+1, pe+i-is, mapin, is, i-1);
root.right = helper(pre, ps+1+i-is, pe, mapin, i+1, ie);
return root;
}
}