/** * Given preorder and inorder traversal of a tree, construct the binary tree * * Note: * You may assume that duplicates do not exist in the tree. * * Tags: Tree, Array, DFS */ class ConstructBTPreInOrder { public static void main(String[] args) { } /** * Get root in preorder and search root in inorder * Then find range for left subtree and right subtree * Recurse down to build subtrees and connect to root */ public TreeNode buildTree(int[] preorder, int[] inorder) { if (preorder == null || inorder == null) return null; return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1); } public TreeNode buildTree(int[] preorder, int[] inorder, int ps, int pe, int is, int ie) { if (ps > pe) return null; int pos = is; TreeNode root = new TreeNode(preorder[ps]); for (; pos <= ie; pos++) { // find root in inorder, no duplicates if (inorder[pos] == preorder[ps]) break; } root.left = buildTree(preorder, inorder, ps + 1, ps - is + pos, is, pos - 1); // left subtree root.right = buildTree(preorder, inorder, ps - is + pos + 1, pe, pos + 1, ie); // right subtree return root; } public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } }