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;
}
}