返回轨道
算法 · 2026-05-14 · 24 阅读

P205 用 1~n 生成二叉搜索树

算法 24 阅读

信号摘要

难度:Medium · 时长:13:33 · leetcode 95 · lintcode 164

P205 用 1~n 生成二叉搜索树

未对外公开播放权限
点击查看说明

描述

这个题目说的是,给你一个整数 n,你要用 1 到 n 这 n 个数字去生成所有可能的二叉搜索树,然后将它们返回。

比如说,给你的 n 是 3,1/2/3 这 3 个数字总共可以构成 5 棵不同的二叉搜索树。如下所示:

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

因此,你要返回这 5 棵二叉搜索树。

相关视频:二叉搜索树的数量

代码

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

    TreeNode(int x) {
      val = x;
    }
  }

  private TreeNode cloneTree(TreeNode root) {
    if (root == null) return null;
    TreeNode newRoot = new TreeNode(root.val);
    newRoot.left = cloneTree(root.left);
    newRoot.right = cloneTree(root.right);
    return newRoot;
  }

  private List<TreeNode> genTrees(int low, int high) {
    if (low > high) return Collections.singletonList(null);
    if (low == high) return Collections.singletonList(new TreeNode(low));
    List<TreeNode> result = new ArrayList<>();

    for (int i = low; i <= high; ++i) {
      List<TreeNode> lefts = genTrees(low, i-1);
      List<TreeNode> rights = genTrees(i+1, high);
      for (TreeNode left: lefts) {
        for (TreeNode right: rights) {
          TreeNode root = new TreeNode(i);
          root.left = cloneTree(left);
          root.right = cloneTree(right);
          result.add(root);
        }
      }
    }
    return result;
  }

  // Time/Space: O(4^n / n^(3/2))
  public List<TreeNode> generateTrees(int n) {
    if (n < 1) return Collections.emptyList();
    return genTrees(1, n);
  }

}

📡 通讯频道