Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
You may assume that duplicates do not exist in the tree.
For example, given
preorder = [3,9,20,15,7] inorder = [9,3,15,20,7]
Return the following binary tree:
3 / \ 9 20 / \ 15 7
Answer from Jiuzhang:
/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */ public class Solution { private int findPosition(int[] arr, int start, int end, int key) { int i; for (i = start; i <= end; i++) { if (arr[i] == key) { return i; } } return -1; } private TreeNode myBuildTree(int[] inorder, int instart, int inend, int[] preorder, int prestart, int preend) { if (instart > inend) { return null; } TreeNode root = new TreeNode(preorder[prestart]); int position = findPosition(inorder, instart, inend, preorder[prestart]); root.left = myBuildTree(inorder, instart, position - 1, preorder, prestart + 1, prestart + position - instart); root.right = myBuildTree(inorder, position + 1, inend, preorder, position - inend + preend + 1, preend); return root; } public TreeNode buildTree(int[] preorder, int[] inorder) { if (inorder.length != preorder.length) { return null; } return myBuildTree(inorder, 0, inorder.length - 1, preorder, 0, preorder.length - 1); } }