ARTS001 - 算法(二叉搜索树 Leetcode 95)

【95. 不同的二叉搜索树 II】

在这里插入图片描述

【思路】

1…n 所有节点都可以是根节点,输出所有的可能

二叉搜索树,左子树<根节点<右子树
左子树和右子树同样也是小的二叉搜索树
因此左右子树生成相较于原问题是一个长度缩小的子问题==》【递归】

1…n 为节点组成的以 i 为根节点组成的二叉搜索树,
左子树(1…i-1) ,根 (i),右子树(i+1…n)

1、外层循环遍历 1~n 所有结点,作为根结点
2、内层双层递归分别求出左⼦树和右⼦树

【解题】 JAVA

	class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        public TreeNode() {
        }

        public TreeNode(int val) {
            this.val = val;
        }

        public TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }

    public List<TreeNode> generateTrees(int n) {
        // 当n为0的时候,是一棵空树
        if (n = 0) {
            return null;
        }
        //1...n
        return generateTrees(1,n);
    }

    private List<TreeNode> generateTrees(int start, int end) {
        List<TreeNode> list = new ArrayList<>();
        //边界条件,子树为空
        if (start > end) {
            list.add(null);
            return list;
        }

        for (int i = start; i <= end ; i++) {
            //左子树生成 (1,i-1)
            List<TreeNode> leftList = generateTrees(start, i-1);
            //右子树生成 (i+1, n)
            List<TreeNode> rightList = generateTrees(i+1, end);
            //左右子树拼接根节点
            for (TreeNode left : leftList) {
                for (TreeNode right :rightList) {
                	//根节点(i)
                    TreeNode root = new TreeNode(i);
                    root.left = left;
                    root.right = right;
                    list.add(root);
                }
            }
        }
        return list;
    }
      1      
        \    
          2  
           \ 
            3  
                    
1 null 2 null 3 null null 

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

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


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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值