Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
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:
tag : tree, Depth-first Search, tree
前序第一个肯定是当前根节点,所以在中序中查找这个根节点所在的位置,那么中序中根节点之前的数都是左子树,以后的数都是右子树
public TreeNode buildTree(int[] preorder, int[] inorder) {
TreeNode head = buildTree(preorder,inorder,0,0,preorder.length-1);
return head;
}
private TreeNode buildTree(int[] preorder, int[] inorder, int preStart, int inStart, int inEnd) {
if (inStart == inEnd)
return new TreeNode(preorder[preStart]);
else if (inStart > inEnd)
return null;
TreeNode head = new TreeNode(preorder[preStart]);
int index = getIndex(inorder,preorder[preStart]);
// preStart-1 即新左子树的根节点, index-1即当前根节点之前的数都属于左子树的节点
head.left = buildTree(preorder,inorder,preStart+1,inStart,index-1);
// index+preStart-instart+1 因为在前序中,根节点之后会先接左子树节点,然后才是右子树的节点,所以index-instart就是左子树节点的个数,preStart + 左子树节点数+1 就是在前序中右子树开始的位置,在中序中,从当前根节点的位置index出发,所以是index + 1
head.right = buildTree(preorder,inorder,index+preStart-inStart+1, index+1, inEnd);
return head;
}
public int getIndex(int[] order, int key){
for (int i = 0; i < order.length; i++) {
if (key == order[i]) return i;
}
return -1;
}