105. Construct Binary Tree from Preorder and Inorder Traversal
分治法后序遍历建树
对数组, 输入值为数组(起始点和终止点控制数组的长度和节点的值---去掉用过的点的位置) :
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; } }
围绕构建节点值, 和递归的输入值的起始点和终止点上面