Leetcode 95.不同的二叉搜索树II

 

题目描述:

    

  给定一个整数 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]
  ]

 

    上一题(Leetcode94.不同的二叉搜索树)是只用算出能生成的二叉树的个数而并不需要知道具体二叉树长什么样,而这道题是基于上一题的升级版,需要具体的求出不同的二叉树。

算法一:递归

   求出所有树依然要同上一题一样,分别将 1 ~ n 的所有数作为根节点。

   递归这个算法可以直接通过看代码理解具体解题思路,也最好理解,所以直接上代码吧。

 

 

public List<TreeNode> generateTrees(int n) {
    List<TreeNode> trees = new ArrayList<TreeNode>();
    if (n == 0) {
        return trees;//没有节点则返回空树
    }
    return getTrees(1, n);
}

private List<TreeNode> getTrees(int start, int end) { 
    List<TreeNode> trees = new ArrayList<TreeNode>();
    if (start > end) {
        trees.add(null);
        return trees;
    }
    //start=end说明只有一个节点,将这个节点作为一棵树加入
    if (start == end) {
        TreeNode tree = new TreeNode(start);
        trees.add(tree);
        return trees;
    }
    //从i=start到end作为根节点
    for (int i = start; i <= end; i++) {
        //得到所有左子树
        List<TreeNode> leftTrees = getTrees(start, i - 1);
         //得到所有右子树
        List<TreeNode> rightTrees = getTrees(i + 1, end);
        //用循环,将不同的左子树与右子树分别相组合
        for (TreeNode leftTree : leftTrees) {
            for (TreeNode rightTree : rightTrees) {
                TreeNode root = new TreeNode(i);
                root.left = leftTree;
root.right
= rightTree;
trees.add(root); } } }
return trees; }

 (^_^后续方法待更新...)

 

转载于:https://www.cnblogs.com/Sherlockmmc/p/11449116.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值