95. Unique Binary Search Trees II

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

这题是NP问题的套路,for循环中调用递归。在NQUEENS中有总结。

我感觉这题思维还挺难的,套用一般的DFS套路还需要想一想,就是树怎么拼接起来的。跟前面一题一样,
我总是会感觉在dfs中先调用递归函数,后面的东西会执行不到,其实是不对的,可以看之前提的问题。

    public List generateTrees(int n) {
        if(n == 0 ) return new ArrayList<>();
        //以root=1开始,root=n结束
        return dfs(1, n);
    }

    private List dfs(int left, int right) {
        List res = new ArrayList<>();
        if (left > right) {
            res.add(null);
            return res;
        }
        for (int i = left; i <= right; i++) {
            //左子树由[left,i-1]的节点构成,右子树由[i+1,right]的节点构成
            List leftSide = dfs(left, i - 1);
            List rightSide = dfs(i + 1, right);
            for (TreeNode lt : leftSide)
                for (TreeNode rt : rightSide) {
                    TreeNode root = new TreeNode(i);
                    root.left = lt;
                    root.right = rt;
                    res.add(root);
                }
        }
        return res;
    }

构造树时两边要遍历所有左右的匹配,然后接到根上面。从两个for循环构造树的过程中可以体会到为什么卡特兰数是要相乘的。

你可能感兴趣的:(95. Unique Binary Search Trees II)