Construct Binary Tree from Preorder and Inorder Traversal
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
Supposed that we have a tree
Preorder : 1,2,4,5,3,6,7
Inorder : 4,2,5,1,6,3,7
We know that the first number of preorder traversal is the root of the binary tree, so that we can get the index of the root in the inorder traversal. According to the inorder traversal, we can split the binary tree into left subtree and right subtree.
leftSubtree: 4,2,5
rightSubtree: 6,3,7
Based on the length of the leftSubtree and rightSubtree, we can get the root for right subtree and left subtree from the preorder traversal respectively.
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || inorder == null || preorder.length == 0 || inorder.length == 0)
return null;
int treeLength = preorder.length;
return buildTreeHelper(preorder, 0, treeLength - 1, inorder, 0, treeLength - 1);
}
private TreeNode buildTreeHelper(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd) {
if (preStart > preEnd || inStart > inEnd)
return null;
int rootVal = preorder[preStart];
int rootIndex = 0;
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == rootVal) {
rootIndex = i;
break;
}
}
TreeNode root = new TreeNode(rootVal);
int leftLength = rootIndex - inStart;
int rightLength = inEnd - rootIndex;
root.left = buildTreeHelper(preorder, preStart + 1, preStart + leftLength, inorder, inStart, rootIndex - 1);
root.right = buildTreeHelper(preorder, preStart + leftLength + 1, preStart + leftLength + rightLength, inorder, rootIndex + 1, rootIndex + rightLength);
return root;
}
}