1. 程式人生 > >LeetCode 95. Unique Binary Search Trees II(唯一二叉搜尋樹)

LeetCode 95. Unique Binary Search Trees II(唯一二叉搜尋樹)

Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.

For example,
Given n = 3, your program should return all 5 unique BST's shown below.

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

方法:遇到這種問題不能用深度優先,要用自頂向下,分而治之。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    private List<TreeNode> generate(int from, int to) {
        List<TreeNode> roots = new ArrayList<>();
        if (from == to) {
            roots.add(new TreeNode(from));
            return roots;
        }
        for(int i=from; i<=to; i++) {
            if (i==from) {
                List<TreeNode> rights = generate(from+1, to);
                for(int j=0; j<rights.size(); j++) {
                    TreeNode root = new TreeNode(from);
                    root.right = rights.get(j);
                    roots.add(root);
                }
            } else if (i==to) {
                List<TreeNode> lefts = generate(from, to-1);
                for(int j=0; j<lefts.size(); j++) {
                    TreeNode root = new TreeNode(to);
                    root.left = lefts.get(j);
                    roots.add(root);
                }
            } else {
                List<TreeNode> lefts = generate(from, i-1);
                List<TreeNode> rights = generate(i+1, to);
                for(int j=0; j<lefts.size(); j++) {
                    for(int k=0; k<rights.size(); k++) {
                        TreeNode root = new TreeNode(i);
                        root.left = lefts.get(j);
                        root.right = rights.get(k);
                        roots.add(root);
                    }
                }
            }
        }
        return roots;
    }
    public List<TreeNode> generateTrees(int n) {
        return generate(1, n);
    }
}