1. 思路
本题使用递归实现,思路为
f(前,中,prel,prer,midl,midr)
区间形式为[prel,prer)
1.根据前序遍历寻找根节点
2. 在中序遍历中找到根节点的下标 mid
3. 求解 prell(左子树前序序列的左边界) prelr midll midlr prerl prerr midrl midrr
4. node(mid).left=f(前,中, prell prelr midll midlr) node(mid).right=f(前,中, prerl prerr midrl midrr)
2. 易错点
递归终止条件为 左==右,return null,如果写成右-左==1(数组有一个元素),返回 对应的节点,如果递归时该子树只有一个节点,此时可以使用该递归条件,因为在此处终止,就不会出现左==右的情况,如果一开始就是左==右,即[],则会数组越界,0越界空数组
3. 代码
public TreeNode jbuildTree(int[] preorder, int[] inorder) {
return buildTreeByDG(preorder,inorder,0,preorder.length,0,inorder.length);
}
public TreeNode buildTreeByDG(int[] preorder, int[] inorder,int prel,int prer,int midl,int midr) {
if(prer-prel==0){
return null;
}
int midvalue=preorder[prel];
int midIndex = searchIndex(midvalue, inorder, midl, midr);
int midll=midl,
midlr=midIndex,
midrl=midIndex+1,
midrr=midr,
prell=prel+1,
prelr=prell+(midlr-midll),
prerl=prelr,
prerr=prer;
TreeNode root = new TreeNode(midvalue);
root.left=buildTreeByDG(preorder,inorder,prell,prelr,midll,midlr);
root.right=buildTreeByDG(preorder,inorder,prerl,prerr,midrl,midrr);
return root;
}
public int searchIndex(int targetValue,int[] inorder, int midl,int midr ){
for (int i = midl; i <midr ; i++) {
if (inorder[i]==targetValue){
return i;
}
}
return -1;
}