1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { private int pos;
public TreeNode buildTree(int[] inorder, int[] postorder) { pos = postorder.length - 1; Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < inorder.length; i++) { map.put(inorder[i], i); } return helper(map, 0, inorder.length - 1, postorder); }
private TreeNode helper(Map<Integer, Integer> map, int iStart, int iEnd, int[] postorder) { if (iStart > iEnd) return null; TreeNode newNode = new TreeNode(postorder[pos]); int rootIdx = map.get(postorder[pos]); pos -= 1; newNode.right = helper(map, rootIdx + 1, iEnd, postorder); newNode.left = helper(map, iStart, rootIdx - 1, postorder); return newNode; } }
|
和105题的解题模板一样. 只是pos要从后往前, 因为是postorder. 本质还是构造同样的场景: 给定一个inorder和postorder, 根据它们去构造树, 只不过我们通过两个指针来界定在最初的inorder和postorder的哪个范围内去构建一个树, 而不是单独传入子array. 进一步简化使得一个global variable记录在postorder中的位置. 具体的思考过程看105题的记录. 构造相同的场景就自然而然的想到使用递归来解决问题.