1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
class Solution { public List<TreeNode> generateTrees(int n) { Map<Pair<Integer, Integer>, List<TreeNode>> memo = new HashMap<>(); return generateTreesWithRoot(1, n, memo); } public List<TreeNode> generateTreesWithRoot(int l, int r, Map<Pair<Integer, Integer>, List<TreeNode>> memo) { List<TreeNode> res = new ArrayList<>(); if(l > r) { res.add(null); return res; }
if(memo.containsKey(new Pair<>(l, r))) { return memo.get(new Pair<>(l, r)); }
for(int i = l; i <= r; i++) { List<TreeNode> leftSubTrees = generateTreesWithRoot(l, i - 1, memo); List<TreeNode> rightSubTrees = generateTreesWithRoot(i + 1, r, memo); for (TreeNode left: leftSubTrees) { for (TreeNode right: rightSubTrees) { TreeNode root = new TreeNode(i, left, right); res.add(root); } } } memo.put(new Pair<>(l, r), res); return res; } }
|