1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| package algorithm;
import java.util.HashMap; import java.util.Map;
public class ConstructBinaryTreeFromPreorderAndInorderTraversal {
private Map<Integer, Integer> indexMap;
public TreeNode myBuildTree(int[] preorder, int[] inorder, int preorderLeft, int preorderRight, int inorderLeft, int inorderRight) { if (preorderLeft > preorderRight) { return null; }
int preorderRoot = preorderLeft; int inorderRoot = indexMap.get(preorder[preorderRoot]);
TreeNode root = new TreeNode(preorder[preorderRoot]); int sizeLeftSubtree = inorderRoot - inorderLeft; root.left = myBuildTree(preorder, inorder,preorderLeft + 1, preorderLeft + sizeLeftSubtree, inorderLeft, inorderRoot - 1); root.right = myBuildTree(preorder, inorder, preorderLeft + sizeLeftSubtree + 1, preorderRight, inorderRoot + 1, inorderRight); return root; }
public TreeNode buildTree(int[] preorder, int[] inorder) { int n = preorder.length; indexMap = new HashMap<>(); for (int i = 0; i < n; i++) { indexMap.put(inorder[i], i); } return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1); }
public static void main(String[] args) {
}
public class TreeNode { int val; TreeNode left; TreeNode right;
TreeNode() { }
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; } } }
|