返回

二分查找树生成攻略:彻底掌握 leetcode 第 95 题!<#>二分查找树生成攻略:彻底掌握 leetcode 第 95 题!</#>

见解分享

生成所有可能的二分查找树

二分查找树简介

二分查找树(BST)是一种特殊的二叉树,它具有以下特征:

  • 节点的左子树中所有节点的值都小于该节点的值。
  • 节点的右子树中所有节点的值都大于该节点的值。
  • 每个节点最多有两个子节点(左子节点和右子节点)。

BST 的结构特性使其非常适合进行快速查找操作。查找一个元素时,我们可以从根节点开始,根据要查找的元素值与当前节点值的比较结果,决定是向左子树还是向右子树查找。这样,查找的时间复杂度可以达到 O(log n),其中 n 是 BST 中元素的数量。

生成所有可能的二分查找树

leetcode 第 95 题要求我们生成所有可能的二分查找树,这些树由 1 到 n 的整数构成。我们可以使用递归的方法来解决这个问题。

  1. 基础情况: 当 n 为 0 时,只有一种可能的二分查找树,即空树。

  2. 递归步骤: 对于 n > 0,我们需要考虑所有以 1 到 n 的每个整数作为根节点的二分查找树。对于每个根节点,我们需要生成其左子树和右子树的所有可能的二分查找树。

  3. 组合子树: 对于给定的根节点,我们可以将其与所有可能的左子树和右子树组合,生成所有可能的二分查找树。

代码示例

下面是 Python、Java 和 C++ 三种语言的代码实现:

Python:

def generate_trees(n):
    if n == 0:
        return [None]

    result = []
    for i in range(1, n + 1):
        left_trees = generate_trees(i - 1)
        right_trees = generate_trees(n - i)

        for left_tree in left_trees:
            for right_tree in right_trees:
                root = TreeNode(i)
                root.left = left_tree
                root.right = right_tree
                result.append(root)

    return result

Java:

public List<TreeNode> generateTrees(int n) {
    if (n == 0) {
        return Collections.emptyList();
    }

    List<TreeNode> result = new ArrayList<>();
    for (int i = 1; i <= n; i++) {
        List<TreeNode> leftTrees = generateTrees(i - 1);
        List<TreeNode> rightTrees = generateTrees(n - i);

        for (TreeNode leftTree : leftTrees) {
            for (TreeNode rightTree : rightTrees) {
                TreeNode root = new TreeNode(i);
                root.left = leftTree;
                root.right = rightTree;
                result.add(root);
            }
        }
    }

    return result;
}

C++:

vector<TreeNode*> generateTrees(int n) {
    if (n == 0) {
        return {};
    }

    vector<TreeNode*> result;
    for (int i = 1; i <= n; i++) {
        vector<TreeNode*> leftTrees = generateTrees(i - 1);
        vector<TreeNode*> rightTrees = generateTrees(n - i);

        for (auto& leftTree : leftTrees) {
            for (auto& rightTree : rightTrees) {
                TreeNode* root = new TreeNode(i);
                root->left = leftTree;
                root->right = rightTree;
                result.push_back(root);
            }
        }
    }

    return result;
}

常见问题解答

  1. 为什么二分查找树在计算机科学中如此重要?
    因为二分查找树可以实现快速查找,查找时间复杂度为 O(log n)。

  2. 生成所有可能的二分查找树的时间复杂度是多少?
    时间复杂度为 O(n^(2n))。

  3. 如何表示二分查找树?
    二分查找树可以使用节点值和左右子树指针来表示。

  4. 二分查找树的应用有哪些?
    二分查找树可以用于排序、查找、范围查询和插入操作。

  5. 如何判断一个树是否为二分查找树?
    我们可以递归地检查树的每个子树是否满足二分查找树的性质。