LeetCode算法题:不同的二叉搜索树 II numTrees

给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。

示例:

输入: 3
输出:
[
  [1,null,3,2],
  [3,2,null,1],
  [3,1,null,null,2],
  [2,1,3],
  [1,null,2,null,3]
]
解释:
以上的输出对应以下 5 种不同结构的二叉搜索树:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

如果将 i 作为根节点,那么 [1, i) 为 i 的左子树节点,(i, n] 为右子树节点。

问题就被拆分为两个子问题了:

求左子树的所有排列
求右子树的所有排列

class Solution {
    public List<TreeNode> generateTrees(int n) {
        List<TreeNode> res = new ArrayList<>();
        if(n < 1)
            return res;
        return generateTrees(1,n);
    }
    private List<TreeNode> generateTrees(int l,int h) {
        List<TreeNode> res = new ArrayList<>();
        if(h < l) {
            res.add(null);
            return res;
        }
        for(int i = l;i <= h;i++) {
            List<TreeNode> left_tree = generateTrees(l, i-1);
            List<TreeNode> right_tree = generateTrees(i+1,h);
            for(int j = 0;j < left_tree.size();j++) {
                for(int k = 0;k < right_tree.size();k++) {
                    TreeNode root = new TreeNode(i);
                    root.left = left_tree.get(j);
                    root.right = right_tree.get(k);
                    res.add(root);
                }
            }
        }
        return res;
    }
}
发布了352 篇原创文章 · 获赞 73 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43777983/article/details/104932422