分治法后序遍历建树
对数组, 输入值为数组(起始点和终止点控制数组的长度和节点的值---去掉用过的点的位置) :
1递归出口, if (prestart > preend || instart > inend) return null;
2构造节点, 根据数组的某个位置
3操作数组的长度, 起始点和终止点--> 为了下一个节点
4分治法建立子节点关系, 改变输入值的数组的起始点和终止点(控制数组的长度和节点的值---去掉用过的点的位置) :
5后序遍历返回root
public TreeNode buildTree(int[] preorder, int[] inorder) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < inorder.length; i++) {
map.put(inorder[i], i);
}
return help(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1, map);
}
private TreeNode help(int[] preorder, int[] inorder,
int prestart, int preend, int instart, int inend, Map map){
if (prestart > preend || instart > inend) return null;
TreeNode root = new TreeNode(preorder[prestart]);
int pos = (int)map.get(root.val);
int gap = pos - instart;
root.left = help(preorder, inorder, prestart + 1, prestart + gap, instart, pos - 1, map);
root.right = help(preorder, inorder, prestart + 1 + gap, preend, pos + 1, inend, map);
return root;
}
}
围绕构建节点值, 和递归的输入值的起始点和终止点上面