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
public class BinaryTree {
public static TreeNode buildTree(int[] preorder, int[] inorder) {
return helper(0, 0, inorder.length - 1, preorder, inorder);
}
public static TreeNode helper(int preStart, int inStart, int inEnd,
int[] preorder, int[] inorder) {
if (preStart > preorder.length - 1 || inStart > inEnd) {
return null;
}
TreeNode root = new TreeNode(preorder[preStart]);
int inIndex = 0; // Index of current root in inorder
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == root.val) {
inIndex = i;
break;
}
}
root.left = helper(preStart + 1, inStart, inIndex - 1, preorder,
inorder);
root.right = helper(preStart + inIndex - inStart + 1, inIndex + 1,
inEnd, preorder, inorder);
return root;
}
public static void main(String[] args) {
int[] preorder = { 3, 9, 20, 15, 7 };
int[] inorder = { 9, 3, 15, 20, 7 };
TreeNode root = buildTree(preorder, inorder);
printInorder(root);
}
static void printInorder(TreeNode node) {
if (node == null)
return;
printInorder(node.left);
System.out.print(node.val + " ");
printInorder(node.right);
}
}
root.right = helper(preStart + inIndex - inStart + 1, inIndex + 1,
inEnd, preorder, inorder);Please note that, the idea behind "preStart + inIndex - inStart + 1"
The whole shebang is we need to pick the node to the right of all the discovered nodes in the preorder array and that is done by not considering all the nodes already seen in the preorder array + all the nodes already found in our inorder array + 1
No comments:
Post a Comment