Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
像一般的tree的问题一样,这题也用递归比较好。
比如这样子的序列:
preorder: 1245367
inorder: 4251637
可以一眼看出的是1一定是这颗树的root,因为pre order traversal是先访问节点本身再访问子树的。再看看in order traversal里面1的位置,是在中间。按照Inorder的定义,先访问左子树再访问右子树。因此可以知道在In order traversal的序列中排在1前面的都是1的左子树的元素,排在1后面的都是1的右子树的元素。对于序列425,其pre order traversal必然是245;对于序列637,其pre order traversal必然是367.这样就有了一个基本的递归。
public class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
TreeNode root = buildTree(preorder, inorder, 0, 0, inorder.length - 1);
return root;
}
public TreeNode buildTree(int[] preorder, int[] inorder, int preIndex, int inStart, int inEnd){
if(inStart > inEnd)
return null;
TreeNode node = new TreeNode(preorder[preIndex]);
if(inStart == inEnd)
return node;
else{
int inIndex = search(inorder, preorder[preIndex]);
int len = inIndex - inStart;
node.left = buildTree(preorder, inorder, preIndex + 1, inStart, inIndex - 1);
node.right = buildTree(preorder, inorder, preIndex + len + 1, inIndex + 1, inEnd);
return node;
}
}
public int search(int[] arr, int value){
int index = -1;
for(int i = 0; i < arr.length; i++){
if(arr[i] == value){
index = i;
break;
}
}
return index;
}
}