leetcode 95. 不同的二叉搜索树 II [java/简单递归]

67 阅读1分钟

题目:

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 **。可以按 任意顺序 返回答案。

思路: 看到树题目,就想递归因为这样简单点

当选择 i 为根节点,那么左子树都比 i小,右子树都比i大。然后拼接左右子树即可。

class Solution {
    public List<TreeNode> generateTrees(int n) {
        if (n == 0) {
            return new ArrayList<>();
        }
        return generateTrees(1, n);
    }
    public List<TreeNode> generateTrees(int s, int e) {
        List<TreeNode> ans = new ArrayList<>();
        if (s > e) {
            ans.add(null);
            return ans;
        }

        for(int i = s; i <= e; i++){
            List<TreeNode> l = generateTrees(s,i - 1);//以i 作为根节点,那么左子树都比i小
            List<TreeNode> r = generateTrees(i + 1,e);//以i 作为根节点,那么右子树都比i大

            for(TreeNode lTree : l ){
                for(TreeNode rTreee : r){
                    TreeNode cur = new TreeNode(i);//选择当前i作为根节点
                    cur.left = lTree;//选择左子树
                    cur.right = rTreee;//选择右子树
                    ans.add(cur);
                }
            }
        }
        return ans;
    }
}