Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
以前在某ACM网站做过这个题,没用递归,差点死了。
这题用递归实现很简单。
public class ConstructBinaryTreefromPreorderandInorderTraversal {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || preorder.length == 0) {
return null;
}
return buildTree(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
}
public TreeNode buildTree(int[] preorder, int start, int end, int[] inorder, int inStart, int inEnd) {
int rootValue = preorder[start];
int rootIndexInInorder = -1;
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == rootValue) {
rootIndexInInorder = i;
break;
}
}
TreeNode rootNode = new TreeNode(rootValue);
int leftCount = rootIndexInInorder - inStart;
if (leftCount > 0) {
rootNode.left = buildTree(preorder, start + 1, start + leftCount, inorder, inStart, rootIndexInInorder - 1);
}
int rightCount = inEnd - rootIndexInInorder;
if (rightCount > 0) {
rootNode.right = buildTree(preorder, start + leftCount + 1, end, inorder, rootIndexInInorder + 1, inEnd);
}
return rootNode;
}
}