[LintCode]Construct Binary Tree from Preorder and Inorder Traversal
/**
* 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 {
/**
*@param preorder : A list of integers that preorder traversal of a tree
*@param inorder : A list of integers that inorder traversal of a tree
*@return : Root of a tree
*/
public TreeNode buildTree(int[] preorder, int[] inorder) {
// 2015-07-22 递归 算清楚左右分支各有几个节点很关键
if (preorder == null || inorder == null || preorder.length == 0 || inorder.length == 0) {
return null;
}
if (preorder.length != inorder.length) {
return null;
}
return helper(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
}
// 递归helper start和end表示子数组首尾元素的序号
private TreeNode helper(int[] preorder, int prestart, int preend, int[] inorder, int instart, int inend) {
//叶节点
if (prestart > preend) {
return null;
}
TreeNode root = new TreeNode(preorder[prestart]);
int pos = findPostion(inorder, instart, inend, preorder[prestart]);
// 左分支有pos - instart个节点
root.left = helper(preorder, prestart + 1, prestart + pos - instart, inorder, instart, pos - 1);
// 右分支有inend - pos个节点
root.right = helper(preorder, prestart + pos - instart + 1, preend, inorder, pos + 1, inend);
return root;
}
// 返回位置序号
private int findPostion(int[] arr , int start, int end, int target) {
if (arr == null || arr.length == 0) {
return -1;
}
for (int i = start; i <= end; i++) {
if (arr[i] == target) {
return i;
}
}
return -1;
}
}